"虚拟继承"的含义是什么?
我看到了以下代码,但不理解在下面的上下文中关键字virtual
的含义:
class A {};
class B : public virtual A;
"虚拟继承"的含义是什么?
我看到了以下代码,但不理解在下面的上下文中关键字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:
...
};
虽然您在上面定义了"Wrong"类,但实际上您创建了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