为什么在声明派生 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) {}
};
我不明白为什么,当我尝试创建基对象 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) {}
};