當我有繼承,該編譯器生成的函數,我通常選擇(構造函數,析構函數,賦值操作符和拷貝構造函數)仍然是我的課產生的?繼承和編譯器生成的函數
比方說,我有這樣的繼承:一個基類B繼承了A(公共)和C繼承了公共繼承B. 我的A類沒有內存分配或任何需要我實現的析構函數,我沒有在那裏實現析構函數,當我編譯我的程序時,它還會創建一個空的A::~A(){}
?
同爲B和C ..謝謝!
當我有繼承,該編譯器生成的函數,我通常選擇(構造函數,析構函數,賦值操作符和拷貝構造函數)仍然是我的課產生的?繼承和編譯器生成的函數
比方說,我有這樣的繼承:一個基類B繼承了A(公共)和C繼承了公共繼承B. 我的A類沒有內存分配或任何需要我實現的析構函數,我沒有在那裏實現析構函數,當我編譯我的程序時,它還會創建一個空的A::~A(){}
?
同爲B和C ..謝謝!
是的,當然。而構造函數/析構函數鏈式調用仍然存在(即,C析構函數將調用B析構函數,它調用析構函數,對構造函數而言相反)。
是,編譯器總是在上課時,用戶沒有明確定義這些函數生成(構造函數,析構函數,賦值操作符和拷貝構造函數)。
如果未由用戶定義,編譯器會在類中插入構造函數,析構函數,複製構造函數和重載賦值運算符。
但最重要的是,如果用戶在一個類中定義了一個參數的構造函數,那麼編譯器將不會生成默認的構造函數,和對象創建不帶任何參數將拋出一個連接錯誤。
例如說,你有一個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.
所以規則的拇指是,如果你提供了你自己的構造函數,總是提供默認的構造函數。
如果沒有什麼別的阻止編譯器生成的功能,那麼他們將被創建。但要小心,因爲它在所有情況下可能不像所期望的那樣,特別是如果您在基類中有非虛擬析構函數。 –