我在类型层次结构中调用构造函数的规则时遇到了棘手的问题.这是我做的:
class A{ protected: int _i; public: A(){i = 0;} A(int i) : _i(i){} virtual ~A(){} virtual void print(){std::cout<<i<<std::endl;} }; class B : virtual public A{ protected: int _j; public: B() : A(){_j = 0;} B(int i,int j) : A(i),_j(j){} virtual ~B(){} virtual void print(){std::cout<<i<<","<<j<<std::endl;} }; class C : virtual public B{ protected: int _k; public: C() : B(){_k = 0;} C(int i,int j,int k} : B(i,j),_k(k){} virtual ~C(){} virtual void print(){std::cout<<i<<","<<j<<","<<k<<std::endl;} }; int main(){ C* myC = new C(1,2,3); myC->print(); delete myC; return 0; }
现在,我想让新的C(1,3)调用B(1,2)的构造函数,然后调用构造函数A(1)来存储_i = 1,_j = 2,_k = 3.在创建类C的实例myC时,出于某种原因我不明白,但是,要调用的第一个构造函数是A的标准构造函数,即A :: A();这显然会导致错误的结果,因为受保护的变量_i被赋值为0.从不调用构造函数A(1).为什么会这样?我发现这非常直观.有没有办法避免显式调用类型层次结构中的所有构造函数来实现所需的行为?
谢谢你的帮助!