2016-02-26 64 views
0

我不明白爲什麼,當我嘗試創建一個基類的對象,我可以,但只有沒有聲明派生類,並聲明派生我需要在基類構造函數中設置參數值爲「= 0」?當我聲明派生類時,爲什麼我需要在基類中爲某個值設置變量?

#include <cstdlib> 

using namespace std; 

class Base { 
    public: 
     int m_nValue; 

     Base(int nValue=0) //<--- why here i need = 0 ? 
      : m_nValue(nValue) 
     {} 
}; 

class Derived: public Base { 
public: 
    double m_dValue; 

    Derived(double dValue) 
     : m_dValue(dValue) 
    {} 
}; 


int main(int argc, char** argv) { 
    Base cBase(5); // use Base(int) constructor 
    return 0; 
} 

回答

2

不,您不需要。問題是,當你繼承,你從來沒有給基類構造函數的任何值,像這樣:

Derived(double dValue) : Base(0), m_dValue(dValue) {} 

所以編譯器會在基類和搜索兩種:一個構造函數不帶參數,或ctor與默認值(他不看默認ctor定義ctor刪除默認ctor)。或者:

class Base { 
public:  
    int m_nValue; 
    Base() : m_nValue(0) {} 
    Base(int nValue) : m_nValue(nValue) {} 
}; 

class Base { 
public:  
    int m_nValue; 
    Base(int nValue=0) : m_nValue(nValue) {} 
}; 
1

Base(int nValue = 0)也將作爲默認構造,由於nValue默認值已經提供。目前,您Derived構造函數會隱式調用此構造,與nValue設置爲0

形式上你實際上並不需要做的 - 但是這將意味着你的類的用戶將不得不爲提供明確的價值nValue你將不得不寫一個默認構造函數。您可以通過編寫Base() = default;來實現後者,但除非使用C++ 11大括號符號(例如Base b{};),否則將不會初始化成員m_nValue。 (請注意,讀取未初始化變量時的行爲是undefined。)

+0

我覺得寫'基地()= default'意味着默認構造函數不會初始化'm_nValue' - 這將是壞的。 –

+0

@MartinBonner:好點,我修改了。 – Bathsheba

相關問題