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的override,BBB使用BB定义的g的override)
问题是:哪些继承关系应该标记为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' : inherits 'class2::member' via dominance)
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(); }
};
考虑以下架构:
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的override,BBB使用BB定义的g的override)
问题是:哪些继承关系应该标记为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' : inherits 'class2::member' via dominance)
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(); }
};