簡體   English   中英

為什么在聲明派生類時需要在基類中將變量設置為某個值?

[英]Why I need to set a variable to some value in base class when I declare a derived class?

我不明白為什么,當我嘗試創建基類的對象時,我可以但只能在不聲明派生類的情況下進行操作,而當聲明派生類時,我需要在基類構造函數中將參數值設置為“ = 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;
}

不,你不會。 問題是,當您子類化時,您永遠不會給基類ctor賦予任何值,如下所示:

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

因此,編譯器查看基類並搜索:不帶參數的ctor或具有默認值的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) {}
};

Base(int nValue = 0)也將充當默認構造函數,因為已經提供了nValue的默認值。 當前,您的Derived構造函數將隱式調用此構造函數,並將nValue設置為0。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM