我在调用类型层次结构中的构造函数的规则时遇到了麻烦。这是我所做的:
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;
}
现在,我想让 new C(1,2,3) 调用 B(1,2) 的构造函数,然后依次调用构造函数 A(1) 来存储 _i=1, _j=2, _k= 3. 在创建类C的实例myC时,由于某种原因我不明白,然而,第一个被调用的构造函数是A的标准构造函数,即A::A(); 这显然会导致错误的结果,因为受保护的变量 _i 被赋值为 0。构造函数 A(1) 永远不会被调用。为什么会这样?我觉得这很反直觉。是否有某种方法可以避免显式调用类型层次结构中的所有构造函数来实现所需的行为?
谢谢你的帮助!