我在調用類型層次結構中的構造函數規則時遇到了棘手的問題。這是我做的:構造函數調用層次結構
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。當創建類C的實例myC時,出於某種原因,我不明白,但是,要調用的第一個構造函數是A的標準構造函數,即A :: A();這顯然會導致錯誤的結果,因爲受保護的變量_i被賦值爲0.構造函數A(1)永遠不會被調用。這是爲什麼?我覺得這非常直觀。是否有某種方法可以避免顯式調用類型層次結構中的所有構造函數以實現所需的行爲?
Thx求救!
Thx爲答案。所以,我想我會回到Stroustrup重新閱讀虛擬繼承的概念。似乎默認情況下使用它並不明智;) – user1999920
許多人想知道爲什麼默認情況下繼承不是虛擬的。那麼,你已經找到了自己的答案:) – Gorpik