2015-06-25 65 views
1

當我有繼承,該編譯器生成的函數,我通常選擇(構造函數,析構函數,賦值操作符和拷貝構造函數)仍然是我的課產生的?繼承和編譯器生成的函數

比方說,我有這樣的繼承:一個基類B繼承了A(公共)和C繼承了公共繼承B. 我的A類沒有內存分配或任何需要我實現的析構函數,我沒有在那裏實現析構函數,當我編譯我的程序時,它還會創建一個空的A::~A(){}

同爲B和C ..謝謝!

+0

如果沒有什麼別的阻止編譯器生成的功能,那麼他們將被創建。但要小心,因爲它在所有情況下可能不像所期望的那樣,特別是如果您在基類中有非虛擬析構函數。 –

回答

1

rule of 5仍然適用於每個類的,獨立於它們的傳承的。

換句話說,如果B是從A派生的,只是因爲A定義了它們的拷貝構造函數,所以不會影響生成B的拷貝構造函數。

但是,您應該注意爲基類if needed定義了一個virtual析構函數。

1

是的,當然。而構造函數/析構函數鏈式調用仍然存在(即,C析構函數將調用B析構函數,它調用析構函數,對構造函數而言相反)。

0

是,編譯器總是在上課時,用戶沒有明確定義這些函數生成(構造函數,析構函數,賦值操作符和拷貝構造函數)。

0

如果未由用戶定義,編譯器會在類中插入構造函數,析構函數,複製構造函數和重載賦值運算符。

但最重要的是,如果用戶在一個類中定義了一個參數的構造函數,那麼編譯器將不會生成默認的構造函數,和對象創建不帶任何參數將拋出一個連接錯誤。

例如說,你有一個A級

class A 
{ 
int a; 
public: 
//..... 
//some line of code 
//..... 
} 

如果不提供任何構造函數,編譯器會生成一個默認的構造函數不接受任何參數A(){}

但是,如果任何機會,你聲明一個參數化的構造像

A(int i) 
{ 
a = i; 
} 

編譯器不產生任何默認構造函數和你的對象創建不帶參數將失敗。

A a; ---> This will fail. 
A b(10) ---> This will pass. 

所以規則的拇指是,如果你提供了你自己的構造函數,總是提供默認的構造函數。