虚拟继承

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)

  • "错了"很可能是"正确的".这取决于实际情况.正常MI和虚拟MI都有自己的位置,即使是出现的(不可怕的)钻石图案的存在.请记住,没有适合所有人的尺寸. (16认同)
  • 我认为你正在引起对错误的关注 - 你的"错误"和"正确"的课程.他们是完全相同的 - 他们不是问题.虽然你正确地为父母C和D提供了虚拟继承,但你基本上可以忽略它 - C和D是那些"错误"并且需要修复的,而不是从它们两者中得到的类. (8认同)
  • 这可以使用更明确的结论。说“虚拟继承,它将知道引用正确的Ambig()函数”是什么意思?怎么知道 对我来说,这如何解决问题还不是很明显。 (3认同)
  • 这对我来说更清楚了:/sf/answers/1512521/ (3认同)