2013-03-19 124 views
0
#include<iostream> 
using namespace std; 

class base 
{ 
    public: 
     virtual void f(){} 
}; 

class middle1:public base 
{}; 

class middle2:public base 
{}; 

class derive:public middle1,public middle2 
{}; 



int main() 
{ 
    derive* pd=new derive(); 
    pd->f(); 
    return 0; 
} 

我知道虚拟解决了这个问题,但是怎么样? 即使我们没有多重继承,我们是否可以始终为安全编写公共虚拟?A类有什么区别:公共虚拟B和A类:public B

+0

虚拟告诉编译器从基地获取方法和成员变量的副本,而不是从中间2 – Prasad 2013-03-19 11:37:12

回答

2

derive的每个实例都有一个middle1基类子对象和一个middle2基类子对象。

如果继承非虚拟的,则middle1基类子对象具有base基类子对象,middle2基类子对象也具有base基类的子对象。因此,中derive每个实例有两个base子对象,呼叫pd->f()是模糊的 - 它的base的对象,你要调用f()吗?

使继承虚拟意味着middle1middle2将共享derive的一个base子对象。这消除了歧义 - 只有一个base对象可以调用f()

我们能总是写的公共虚拟安全

不一定。有可能是继承层次中,你不希望middle1middle2共享一个公共base子对象。你可能会认为,在这种情况下,你不应该写一个类derive来自两个继承,但如果你做这种情况最终会那么解决办法是做两种:

static_cast<middle1*>(pd)->f(); 
pd->middle1::f(); 

指定要叫fmiddle1基类的子对象,或

static_cast<middle2*>(pd)->f(); 
pd->middle2::f(); 

指定middle2

1

我知道虚拟解决了这个问题,但是怎么样?

virtual关键字通过使只有一个顶部顺序基类子对象存在于继承层次结构解决了这个问题。没有它,每个父类middle1 & middle2都有它们自己的base类的副本,因此导致含糊不清。

即使我们没有多重继承,我们是否可以总是写出公共虚拟的安全性?

如果没有多重继承,没有理由使用virtual继承。多重继承是虚拟继承概念存在的目的。

1

虚拟基类中为了解决金刚石问题(见this question)实施附加间接级。

如果你总是使用虚拟继承,你总是会遭受额外的间接层面造成的性能损失。

因此,我建议,当你有你只使用虚拟继承。

相关问题