当前位置:  开发笔记 > 编程语言 > 正文

虚拟继承

如何解决《虚拟继承》经验,为你挑选了1个好方法。



1> ogee..:

虚拟继承用于解决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


"错了"很可能是"正确的".这取决于实际情况.正常MI和虚拟MI都有自己的位置,即使是出现的(不可怕的)钻石图案的存在.请记住,没有适合所有人的尺寸.
我认为你正在引起对错误的关注 - 你的"错误"和"正确"的课程.他们是完全相同的 - 他们不是问题.虽然你正确地为父母C和D提供了虚拟继承,但你基本上可以忽略它 - C和D是那些"错误"并且需要修复的,而不是从它们两者中得到的类.
这可以使用更明确的结论。说“虚拟继承,它将知道引用正确的Ambig()函数”是什么意思?怎么知道 对我来说,这如何解决问题还不是很明显。
这对我来说更清楚了:/sf/ask/17360801/
推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有