C++多个钻石继承和纯虚函数
C++ multiple diamonds inheritance and pure virtual functions
请考虑以下体系结构:
class A //abstract interface
{
public:
virtual void f() = 0;
};
class AA : public A //abstract interface
{
public:
virtual void g() = 0;
};
class AAA : public AA //abstract interface
{
public:
virtual void h() = 0;
};
class B : public A // implementation class
{
public:
void f() override {};
};
class BB : public B, public AA {}; // implementation class
{
public:
void g() override {};
};
class BBB : public BB, public AAA {}; // implementation class
{
public:
void h() override {};
};
因此,BB
和 BBB
是虚类,因为 f 没有被 BB 覆盖,f 和 g 都不会被 BBB 覆盖。我希望能够实例化 BB 和 BBB(这样 BB 和 BBB 使用由 B 定义的 f 的覆盖,而 BBB 使用由 BB 定义的 g 的覆盖(。
问题是:哪些继承关系应该标记为virtual
以实例化BB
和BBB
?
理想情况下,继承图应如下所示:
A
|
|
|
AA B
| |
| |
AAA BB
|
|
BBB
此设计背后的想法是 A、AA 和 AAA 是描述增量功能级别的接口。B、BB 和 BB 是一个对应的增量实现。(例如,BB定义了AA所需的一切,并且还具有B中的内容(
如果A AA AAA
真的只是接口,我的意思是它们没有任何成员,那么你不需要任何virtaul
继承,只实现接口并从基类调用它们。你在 B 中为接口 A 实现的内容也必须在 BB 中实现,然后在 BB
中调用 B:pureVirtual()
。否则应该是这样的;(然后你应该看看:"class1":通过支配继承"class2::member"(
class A
{
public:
virtual void f() = 0;
};
class AA : virtual public A
{
public:
virtual void g() = 0;
};
class AAA : virtual public AA
{
public:
virtual void h() = 0;
};
class B : virtual public A
{
public:
void f() override { }
};
class BB : public B, virtual public AA
{
public:
void g() override { }
};
class BBB : public BB, public AAA
{
public:
void h() override { }
};
编辑:(无虚拟继承(
class A //abstract interface
{
public:
virtual void f() = 0;
};
class AA : public A //abstract interface
{
public:
virtual void g() = 0;
};
class AAA : public AA //abstract interface
{
public:
virtual void h() = 0;
};
class B : public A // implementation class
{
public:
void f() override {}
};
class BB : public B, public AA // implementation class
{
public:
void g() override {}
void f() override { B::f(); }
};
class BBB : public BB, public AAA // implementation class
{
public:
void h() override {}
void g() override { BB::g(); }
void f() override { BB::f(); }
};
相关文章:
- C++虚函数继承
- 名称隐藏对静态函数继承的实例使用
- C++ std::vector 中的虚拟析构函数继承
- 具有相同名称的类的构造函数继承
- 多复制构造函数继承中的惊人行为
- CRTP 和复制/移动赋值/构造函数继承
- 复制构造函数继承动态分配的数组
- 谷神星求解器成本函数继承错误:模板可能不是虚拟的
- 无法从 c++ 中的构造函数继承
- 在构造函数继承中使用默认构造函数
- 如何定义从虚拟函数继承的静态函数
- 调用超类函数继承 c++
- 构造函数继承和直接成员初始化
- c++ 不明确的双非虚函数继承
- C++ - 使用私有参数的构造函数继承
- 通过可变参数模板进行C++11构造函数继承
- 使用模板进行函数继承
- C++11构造函数继承和不带参数的构造函数
- 函数继承问题
- C++11 - 构造函数继承