首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

初始化列表的有关问题(当一个类既继承了虚基类,又直接继承了基类)

2012-08-07 
初始化列表的问题(当一个类既继承了虚基类,又直接继承了基类)C/C++ codeclass Base{public:Base (){b1}B

初始化列表的问题(当一个类既继承了虚基类,又直接继承了基类)

C/C++ code
class Base{public:    Base (){b=1;}    Base (int xx):b(xx){}    int b;    virtual ~Base(){    }    void print(){std::cout<<b<<"\n";}};class Base1:public virtual Base{};class Base2:public virtual Base{};class multiderived: public Base1, public Base2, public Base{public:    multiderived():Base(7),Base1(),Base2(),Base(3){}};int _tmain(int argc, _TCHAR* argv[]){    multiderived multid;        multid.print();//7        return 1;}


在vs2010中,
multiderived():Base(7),Base1(),Base2(),Base(3){}这行编辑器会显示Error: base class "Base" is ambiguous
但编译仍能通过,单步调试发现虚基类Base和直接基类Base都被初始化,前者b是3,后者b是7,但为啥不是前者是7后者是3?
换句话说,如何指明初始化列表中的Base(int)到底是在初始化谁?
另外在用户代码中,应该如何指定是虚基类的print还是直接基类的print?

[解决办法]
下面这样该就可以了。
C/C++ code
class multiderived: public Base1, public Base2, public virtual Base   // Base 前面也加一个virtual{public:    multiderived():Base(7),Base1(),Base2(){}  // 不要在此两次调用Base的构造函数};
[解决办法]
你那样初始化没报错有点奇怪, 那两次对 Base 的初始化都应该是初始化直接继承那一份.而初始化两次是应该报错的.

如果要初始化话间接虚拟继承里的那一份 Base, 应该用 Base1::Base(7) 或者 Base2::Base(7).

要调用直接继承那一份 Base 的 print 用
((Base&)multid).print(); 
就可以了.
要调用虚拟继承的那一份, 用
((Base&)(Base1&)multid).print(); 
或者
((Base&)(Base2&)multid).print();
都行.
[解决办法]
C++和C一样,尽量假设程序员自己知道自己在做什么,并且对暂时还没被使用的错误尽量不报错。
习惯就好了。
并且,习惯于自己知道自己在做什么

热点排行