型階層内のコンストラクターのルールを呼び出すのに苦労しています。これが私がすることです:
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)のコンストラクターを呼び出し、次にコンストラクターA(1)を呼び出して_i = 1、_j = 2、_k=を格納するようにします。 3.3。クラスCのインスタンスmyCを作成するとき、何らかの理由で私にはわかりませんが、最初に呼び出されるコンストラクターはAの標準コンストラクター、つまりA :: A()です。保護された変数_iに値0が割り当てられるため、これは明らかに間違った結果につながります。コンストラクターA(1)が呼び出されることはありません。なんでそうなの?これは非常に直感的ではありません。目的の動作を実現するために、型階層内のすべてのコンストラクターを明示的に呼び出さないようにする方法はありますか?
助けてくれてありがとう!