我有一个基类 B,我将从它派生类 D。D 中唯一的区别是我重写了一个方法。
我是否必须在 D 中重写 B 的构造函数,因为它所做的只是使用完全相同的参数调用 B 的构造函数? 如果我不在 D 中声明构造函数(在析构函数上),它会只使用 B 的吗? 如果是这样,从哪个版本的 C++ 开始它会这样做。
构造函数不能被重写。 他们的作用是正确初始化每个类。
派生类初始化它的变量。 基类初始化它的变量。
您知道您正在构造哪个类,因此不需要虚拟构造函数。 (但是如果你需要创建一个在运行时做出决定的类,你需要知道什么是工厂方法)
但是删除更加棘手(因为您可能持有一个指向基类的指针,该基类被实例化为派生类)
这就是为什么具有虚拟方法的类中的析构函数默认应该是虚拟的(此规则有例外 - 高级主题)。
class Base
{
private:
int m_secret;
public:
Base(int magic_number)
: m_secret(magic_number)
{}
virtual int get_secret()
{
return m_secret;
}
virtual ~Base() = default;
};
class Derived : public Base
{
private:
int m_multiplier;
public:
Derived(int magic_number, int multiplier)
: Base(magic_number),
m_multiplier(multiplier)
{}
int get_secret() override
{
return Base::get_secret() * m_multiplier;
}
~Derived() override = default;