[英]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中界面中的实现什么,一定要在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 { }
};
编辑:(没有虚拟继承)
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(); }
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.