“虚拟”继承的含义是什么?
我看到了下面的代码,不明白关键字 virtual在下面的上下文中的含义:
virtual
class A {}; class B : public virtual A;
虚继承是用来解决 DDD 问题的。
请看下面的示例,其中有两个从同一个基类继承的类:
class Base { public: virtual void Ambig(); };
class C : public Base { public: //... }; class D : public Base { public: //... };
现在,您希望创建一个同时继承 C 和 D 类(这两个类都继承了 Base: : Ambig ()函数)的新类:
class Wrong : public C, public D { public: ... };
当您定义上面的“错误”类时,您实际上创建了 DDD (钻石派生问题) ,因为您不能调用:
Wrong wrong; wrong.Ambig();
这是一个模棱两可的函数,因为它被定义了两次:
Wrong::C::Base::Ambig()
还有:
Wrong::D::Base::Ambig()
为了避免这种问题,你应该使用虚继承,它会知道引用正确的 Ambig()函数。
Ambig()
所以,定义一下:
class C : public virtual Base class D : public virtual Base class Right : public C, public D