“虚拟”继承是什么意思?
看了下面的代码,没看懂virtual
下面上下文中关键字的含义:
class A {};
class B : public virtual A;
“虚拟”继承是什么意思?
看了下面的代码,没看懂virtual
下面上下文中关键字的含义:
class A {};
class B : public virtual A;
虚拟继承用于解决 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