[英]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.