C++ 虚拟继承

C++ 虚拟继承,c++,inheritance,virtual,C++,Inheritance,Virtual,“虚拟”继承的含义是什么 我看到了以下代码,不理解以下上下文中关键字virtual的含义: class A {}; class B : public virtual A; 虚拟继承用于解决DDD问题(派生上可怕的菱形) 请看以下示例,其中有两个类继承自同一基类: class Base { public: virtual void Ambig(); }; 现在,您想创建一个新类,该类同时继承C类和D类(它们都继承了Base::Ambig()函数): 当您在上面定义“错误”类时,实

“虚拟”继承的含义是什么

我看到了以下代码,不理解以下上下文中关键字
virtual
的含义:

class A {};
class B : public virtual A;

虚拟继承用于解决DDD问题(派生上可怕的菱形)

请看以下示例,其中有两个类继承自同一基类:

class Base
{

public:

 virtual void  Ambig();

};


现在,您想创建一个新类,该类同时继承C类和D类(它们都继承了Base::Ambig()函数):

当您在上面定义“错误”类时,实际上创建了DDD(菱形派生问题),因为您不能调用:

Wrong wrong;
wrong.Ambig(); 
这是一个不明确的函数,因为它定义了两次:

Wrong::C::Base::Ambig()
以及:

为了防止此类问题,您应该使用虚拟继承,它将知道如何引用正确的
Ambig()
函数

因此-定义:

class C : public virtual Base

class D : public virtual Base

class Right : public C, public D

错误
很可能是
正确的
。这要视情况而定。正常心肌梗死和虚拟心肌梗死都有各自的位置,即使在出现(并非可怕的)菱形图案的情况下也是如此。记住,没有适合所有人的尺寸。我认为你把注意力吸引到了错误的事情上——你的“错误”和“正确”课程。它们完全相同是有原因的——它们不是问题所在。虽然您正确地拥有父级C和D的虚拟继承,但您基本上忽略了它-C和D是“错误”的,需要修复,而不是从它们派生的类。这可以使用更明确的结论。“虚拟继承,它将知道引用正确的Ambig()函数”是什么意思?它怎么知道?我不清楚这是如何解决问题的。这对我来说更清楚:Have a(以前有人问过)。
Wrong::C::Base::Ambig()
Wrong::D::Base::Ambig()
class C : public virtual Base

class D : public virtual Base

class Right : public C, public D