虚拟继承 [英] virtual inheritance
问题描述
virtual继承的意义是什么?
我看到下面的代码,不明白关键字 virtual
在以下上下文中:
class A {};
B类:public virtual A;
虚拟继承用于解决DDD问题查看下面的示例,其中有两个类继承自同一个基类:
class Base
{
public:
virtual void Ambig
};
C:public Base
{
public:
// ...
};
class D:public Base
{
public:
// ...
}
现在,您要创建一个新类继承了C和D类(它们都继承了Base :: Ambig()函数):
class Wrong:public C,public D
{
public:
...
};
在上面定义Wrong类时,实际上创建了DDD(Diamond Derivation问题)因为你不能调用:
错误;
wrong.Ambig();
这是一个模糊的函数,因为它定义了两次:
Wrong :: C :: Base :: Ambig()
$ b b
和:
Wrong :: D :: Base :: Ambig()
为了防止这种问题,你应该使用虚拟继承,这将知道引用正确的 Ambion()
function。
所以 - define:
<
class C:public virtual Base
class D:public virtual Base
class Right:public C,public D
What is the meaning of "virtual" inheritance?
I saw the following code, and didn't understand the meaning of the keyword virtual
in the following context:
class A {};
class B : public virtual A;
Virtual inheritance is used to solve the DDD problem (Dreadful Diamond on Derivation).
Look at the following example, where you have two classes that inherit from the same base class:
class Base
{
public:
virtual void Ambig();
};
class C : public Base
{
public:
//...
};
class D : public Base
{
public:
//...
};
Now, you want to create a new class that inherits both from C and D classes (which both have inherited the Base::Ambig() function):
class Wrong : public C, public D
{
public:
...
};
While you define the "Wrong" class above, you actually created the DDD (Diamond Derivation problem), because you can't call:
Wrong wrong;
wrong.Ambig();
This is an ambiguous function because it's defined twice:
Wrong::C::Base::Ambig()
And:
Wrong::D::Base::Ambig()
In order to prevent this kind of problem, you should use the virtual inheritance, which will know to refer to the right Ambig()
function.
So - define:
class C : public virtual Base
class D : public virtual Base
class Right : public C, public D
这篇关于虚拟继承的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!