2014-01-27 180 views
0

也許這是一個初學者的問題,但我需要一些關於這個問題的幫助。創建從基類繼承的對象

假設有從本身從C類繼承現在

在類的構造函數看起來像這樣一切都很好B類繼承A類:

A::A(params) 
    :B(params) 
{ 
} 

接下來,我試過,但失敗:

A::A(params) 
    :C(params) 
{ 
} 

爲什麼我不能忽略繼承的B在這裏 - 或者是有辦法使這個可能嗎?定義如下不起作用,這裏編譯器抱怨C是已經是一個基類的:

class A : B, C 
+0

「它失敗」不是一個很好的問題描述。什麼是你看到的真正的錯誤? – Jon

+0

B有一個非默認構造函數嗎? – Gasim

+1

@Jon,「type'C'不是'A'的直接或虛擬基礎」 – Shoe

回答

0

爲什麼我不能忽略B中的inheritacne - 或者有什麼辦法可以做到這一點?

因爲類只能決定如何構造它們的直接子對象。 A的直接子對象是B,而BCB對象也需要構建,你不能繞過它。

你得到了error,基本上抱怨這個。

定義如下不起作用,這裏編譯器抱怨C是已經是一個基類的:class A : B,C

有了:

class A : B, C 

你實際上是宣告私人多重繼承。而且既然你說B已經有一個子對象(繼承自)C,編譯器抱怨從C繼承A是沒用的。

但請記得總是指定private/protected/public種類的繼承,以避免混淆。默認情況下,class es的繼承爲privatestruct s爲public。所以上面的代碼對應於:

class A : private B, private C 
0

你應該寫:

class C 
{ 
public: C(ParamType param) { ... } 
}; 

class B : public C 
{ 
public: B(ParamType param) : C(param) { ... } 
}; 

class A : public B 
{ 
public: A(ParamType param) : B(param) { ... } 
}; 

實在是沒有別的辦法....

+0

正如Jeffrey在他的評論中所說的,當C是B的虛擬基類時,我可以在構造函數初始化程序中調用C的構造函數A列表。 – sajas

+0

確實。虛擬基地是一種例外。這是一個複雜的情況。你確定你確實需要這個嗎?首先閱讀這篇文章,並提供更多證據表明您需要這些。 –