C++ 虚继承对基类构造函数调用顺序的影响
作者:网络转载 发布时间:[ 2012/10/8 10:15:47 ] 推荐标签:
而现在我们换种方式使用虚继承:
class stream
{
public:
stream(){cout<<"stream::stream()!"<<endl;}
};
class iistream:public stream
{
public:
iistream(){cout<<"istream::istream()!"<<endl;}
};
class oostream:public stream
{
public:
oostream(){cout<<"ostream::ostream()!"<<endl;}
};
class iiostream:virtual iistream,virtual oostream
{
public:
iiostream(){cout<<"iiostream::iiostream()!"<<endl;}
};
int main(int argc, const char * argv[])
{
iiostream oo;
};
其输出结果为:
stream::stream()!
istream::istream()!
stream::stream()!
ostream::ostream()!
iiostream::iiostream()!
从结果可以看到,其构造过程中重复出现基类stream的构造过程。这样完全没有达到虚拟继承的目的。其继承结构为:
stream stream
/
istream ostream
/
iiostream
从继承结构可以看出,如果iiostream对象调用基类stream中的成员方法,会导致方法的二义性。因为iiostream含有指向其虚继承基类 istream,ostream的vptr。而 istream,ostream包含了stream的空间,所以导致iiostream不知道导致是调用那个stream的方法。要解决改问题,可以指定vptr,即在调用成员方法是需要加上作用域,例如
class stream
{
void f(){cout<<"here!"<<endl;}
}
main()
{
iiostream ii;
ii.f();
}

sales@spasvo.com