這裏是我的問題的一個例子:爲什麼派生類的構造函數應該在其初始化列表中使用基類的默認構造函數?
class MyBaseClass
{
public:
MyBaseClass(): my_bool(false), my_value(0)
{}
MyBaseClass(bool b, int i): my_bool(b), my_value(i)
{}
private:
bool my_bool;
int my_value;
}
class MyDerivedClass1 : public ::MyBaseClass
{
public:
MyDerivedClass1(double d): my_double(d)
{}
private:
double my_double;
}
class MyDerivedClass2 : public ::MyBaseClass
{
public:
MyDerivedClass2(double d): MyBaseClass(), my_double(d)
{}
private:
double my_double;
}
爲什麼不是MyDerivedClass1
初始化我的派生類與不必在MyDerivedClass2
明確初始化基類像一個確定的呢?
我想我不明白爲什麼我不能只依靠C++調用我的基構造函數?我知道如果我想讓它們初始化爲不同的東西,我必須在初始化列表中調用另一個構造函數,但是我想要的只是要調用的基礎構造函數。
你得到一個錯誤?如果您調用基構造函數,編譯器應自動調用基類的默認構造函數。 – NathanOliver
@NathanOliver - 不,我沒有得到一個錯誤。我在代碼審查中被告知將基礎構造函數包含在MyDerivedClass2中,我問爲什麼。沒有人能給我一個很好的理由,缺少「文檔」。所以我在問爲什麼在這裏。另外,正如我在最佳實踐中谷歌週刊所說的那樣,調用基礎構造函數和我的同事選定這些原因,但我不知道爲什麼我應該在這種情況下。我希望有人有一個很好的理由。 – TWhite
這聽起來像是一個編碼標準問題,在這種情況下,答案可能是沿着「它表明你已經考慮它並決定構建基礎的默認值是合適的,而不是忘記它」。 –