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();
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11