我在处理一个类型层次结构中的构造函数调用规则时遇到了一些棘手的问题。以下是我的做法:
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,2,3)调用B(1,2)的构造函数,然后B(1,2)再调用A(1)的构造函数来存储_i=1,_j=2,_k=3。但是,在创建类C的实例myC时,由于某种我不理解的原因,首先调用的是A的标准构造函数,即A::A();这显然会导致错误的结果,因为受保护变量_i被赋值为0。构造函数A(1)从未被调用。这是为什么呢?我觉得这非常反直觉。有没有一些方法可以避免显式调用类型层次结构中的所有构造函数以实现期望的行为呢?
谢谢你的帮助!