Mar*_*ein 5 c++ virtual-functions interface multiple-inheritance diamond-problem
考虑以下架构:
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 {};
};
Run Code Online (Sandbox Code Playgroud)
这样,BB和BBB是虚类,因为F不是由BB重写,和f也不克既不是通过BBB。我希望能够实例化BB和BBB(以便BB和BBB使用B定义的f的覆盖,而BBB使用BB定义的g的覆盖)。
问题是:哪些继承关系应标记为virtual实例化BB和BBB?
继承图在理想情况下应如下所示:
A
|\
| \
| \
AA B
| \ |
| \ |
AAA BB
\ |
\ |
BBB
Run Code Online (Sandbox Code Playgroud)
该设计背后的思想是A,AA和AAA是描述增量功能级别的接口。B,BB和BB是一种相应的增量实现。(因此,例如,BB定义了AA所需的一切,并且还具有B中的功能)
如果A AA AAA真的只是接口,我的意思是它们没有任何成员,那么您不需要任何virtaul继承,只实现接口并从基类调用它们。您在 B 中为接口 A 实现的内容,也必须在 BB 中实现,然后B:pureVirtual()调用BB. 否则应该是这样的;(那么你应该看看:'class1' :通过 dominance 继承 '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 { }
};
Run Code Online (Sandbox Code Playgroud)
编辑:(没有虚拟继承)
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(); }
};
Run Code Online (Sandbox Code Playgroud)