【问题标题】:Why I need to set a variable to some value in base class when I declare a derived class?为什么在声明派生类时需要将变量设置为基类中的某个值?
【发布时间】:2016-02-26 09:45:47
【问题描述】:

我不明白为什么,当我尝试创建基类的对象时,我可以,但只能在不声明派生类的情况下,并且在声明 Derived 时我需要在基类构造函数中将参数值设置为“= 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;
}

【问题讨论】:

    标签: c++ inheritance derived


    【解决方案1】:

    不,你没有。问题是当你继承子类时,你永远不会给基类 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) {}
    };
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我认为写Base() = default 意味着默认构造函数不会初始化m_nValue - 这会很糟糕。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2017-12-18
      相关资源
      最近更新 更多