虚拟继承用于解决DDD问题(Dreadful Diamond on Derivation).
请看下面的示例,其中有两个继承自同一基类的类:
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()
函数.
所以 - 定义:
class C : public virtual Base class D : public virtual Base class Right : public C, public D