Gal*_*man 57 c++ virtual inheritance
"虚拟"继承的含义是什么?
我看到以下代码,并且virtual在以下上下文中不理解关键字的含义:
class A {};
class B : public virtual A;
Run Code Online (Sandbox Code Playgroud)
oge*_*gee 44
虚拟继承用于解决DDD问题(Dreadful Diamond on Derivation).
请看下面的示例,其中有两个继承自同一基类的类:
class Base
{
public:
virtual void Ambig();
};
Run Code Online (Sandbox Code Playgroud)
class C : public Base
{
public:
//...
};
class D : public Base
{
public:
//...
};
Run Code Online (Sandbox Code Playgroud)
现在,您要创建一个继承C和D类的新类(它们都继承了Base :: Ambig()函数):
class Wrong : public C, public D
{
public:
...
};
Run Code Online (Sandbox Code Playgroud)
当您在上面定义"错误"类时,您实际上创建了DDD(钻石衍生问题),因为您无法调用:
Wrong wrong;
wrong.Ambig();
Run Code Online (Sandbox Code Playgroud)
这是一个模糊的函数,因为它定义了两次:
Wrong::C::Base::Ambig()
Run Code Online (Sandbox Code Playgroud)
和:
Wrong::D::Base::Ambig()
Run Code Online (Sandbox Code Playgroud)
为了防止出现这种问题,你应该使用虚拟继承,它将知道引用正确的Ambig()函数.
所以 - 定义:
class C : public virtual Base
class D : public virtual Base
class Right : public C, public D
Run Code Online (Sandbox Code Playgroud)