gpt4 book ai didi

c++ - 使用多重继承来满足抽象基类

转载 作者:太空狗 更新时间:2023-10-29 20:12:55 24 4
gpt4 key购买 nike

为什么这不起作用?继承的函数签名是否略有不正确,或者抽象基类是在成员函数被继承之前强制执行的,还是别的什么?这是否可以在没有函数包装器的情况下工作?

#include <iostream>

struct AbsBase {
virtual void foo() = 0;
virtual void bar() = 0;
};

struct ProvideFoo {
void foo() { std::cout << "foo\n"; }
};

struct ProvideBar {
void bar() { std::cout << "bar\n"; }
};

struct Concrete : public ProvideFoo, public ProvideBar, public AbsBase {
// I guess I could put function wrappers here... sigh...
//void bar() {ProvideBar::bar();}
//void foo() {ProvideFoo::foo();}
};

int main() {
Concrete c;
c.foo();
c.bar();
}

最佳答案

为什么你的代码编译失败

我认为反对者对你有点苛刻,因为你通过单独的类提供两个纯虚函数的实现的推理具有一些直观的吸引力。

唉,你同时在做两件不相关的事情。 ProvideFooProvideBarAbsBase 抽象类完全无关。您也可以从 AbsBase 继承它们两个,但它们仍然是一个抽象类。无论哪种情况,您当前的 Concrete 都是一个抽象类,因为它派生自至少一个具有纯虚函数的类。您不能从此类类创建对象。

修复你的代码,第一部分

最简单的方法是完全放弃 AbsBase 的子类化,直接从 ProvideFooProvideBar 中继承子类。当然,现在 Concrete 中没有 virtual 函数,因此进一步的子类化不能轻易覆盖 foobar 功能。

#include <iostream>

struct ProvideFoo {
void foo() { std::cout << "foo\n"; }
};

struct ProvideBar {
void bar() { std::cout << "bar\n"; }
};

struct Concrete : public ProvideFoo, public ProvideBar {};

int main() {
Concrete c;
c.foo();
c.bar();
}

Live Example I

修复代码,第二部分

您还可以创建多个接口(interface)和多个具体实现,如下所示:

#include <iostream>

struct AbsFoo {
virtual void foo() = 0;
};

struct AbsBar {
virtual void bar() = 0;
};

struct ProvideFoo: AbsFoo {
void foo() { std::cout << "foo\n"; }
};

struct ProvideBar: AbsBar {
void bar() { std::cout << "bar\n"; }
};

struct Concrete : public ProvideFoo, public ProvideBar {};

int main() {
Concrete c;
c.foo();
c.bar();
}

Live Example II

修复代码,第三部分

现在再来一次:当从 AbsBase 继承 ProvideFooProvideBar 时,您还可以使用 virtual 继承使用 virtual 关键字

#include <iostream>

struct AbsBase {
virtual void foo() = 0;
virtual void bar() = 0;
};

struct ProvideFoo: virtual AbsBase {
void foo() { std::cout << "foo\n"; }
};

struct ProvideBar: virtual AbsBase {
void bar() { std::cout << "bar\n"; }
};

struct Concrete : public ProvideFoo, public ProvideBar {};

int main() {
Concrete c;
c.foo();
c.bar();
}

这是非常高级的 C++,如果您的类还包含成员数据,它会变得非常复杂。我更愿意为您的代码使用第二种解决方案。

Live Example III

关于c++ - 使用多重继承来满足抽象基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24580069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com