为什么在声明派生 class 时需要将变量设置为基 class 中的某个值?

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

我不明白为什么,当我尝试创建基对象 class 时,我可以,但只能不声明派生 class,并且在声明派生时我需要设置参数值在 base 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;
}

Base(int nValue = 0) 也将充当 default 构造函数,因为已经提供了 nValue 的默认值。当前,您的 Derived 构造函数将隐式调用此构造函数,其中 nValue 设置为 0。

形式上你实际上不需要这样做 - 但这意味着你的 class 的用户必须为 nValue 你提供一个明确的值将不得不编写默认构造函数。您可以通过编写 Base() = default; 来实现后者,尽管这样成员 m_nValue 将不会被初始化 除非 您使用 C++11 花括号表示法(例如 Base b{};). (请注意,读取未初始化变量的行为是 undefined。)

不,你不知道。问题是,当你使用 subclass 时,你永远不会给基础 class 构造器任何值,就像这样:

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

所以编译器查看基 class 并搜索:一个没有参数的构造函数,或者一个有默认值的构造函数(他不查看默认构造函数,因为定义一个构造函数会删除默认值构造函数)。或者:

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) {}
};