初始化列表的问题(当一个类既继承了虚基类,又直接继承了基类)
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;}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一样,尽量假设程序员自己知道自己在做什么,并且对暂时还没被使用的错误尽量不报错。
习惯就好了。
并且,习惯于自己知道自己在做什么