c++ - 派生类的构造函数调用的函数在基类中不应该是纯虚拟的

标签 c++ constructor pure-virtual

我有一个基类和许多派生类。

派生类的构造函数都需要调用一个具有相同签名的函数reset()。因此,我想在基类中声明一个纯虚函数 virtual void reset() = 0 作为接口(interface)。

但是,问题是:

它不应该在构造函数中调用虚函数。

但我希望reset() 是基类提供的接口(interface)。这样所有的派生类都要分别实现reset。

我该怎么办?

最佳答案

与其强制他们调用一个函数(无论如何你都不能保证),不如让基类构造函数期望一个包含你需要的行为的参数。

这样,基类是自包含的,并且在其构造函数运行时具有所有必需的信息。


例如,如果您正在考虑这样的事情:

class Base
{
public:
    Base()
    {
        reset();
    }

protected:
    virtual void reset() = 0;
    void setValue(int value);
};

class Derived : public Base
{
public:
    void reset() override
    {
        setValue(20);
    }
};

你可以这样做:

class Base
{
public:
    explicit Base(int value)
    {
        setValue(value);
    }

private: // can be private
    void setValue(int value);
};

class Derived : public Base
{
public:
    Derived()
    : Base(20)
    {
    }
};

关于c++ - 派生类的构造函数调用的函数在基类中不应该是纯虚拟的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56753454/

相关文章:

c++ - 如何使用 boost::iostreams 更改缓冲区大小?

c++ - 如何在 QML 中访问基于 QObjectList 的模型中的特定元素

C++ 不在构造函数定义中命名类型

java - 在构造函数中设置变量数组的最小大小

C++ 依赖于派生类的纯虚函数

c++ - 为什么这不是纯虚函数的调用?

c++ - 纯虚函数的奇怪行为

对象的 C++ vector 与指向对象的指针 vector

c++ - 为什么thread_local不能应用于非静态数据成员以及如何实现线程局部非静态数据成员?

javascript - 如何为构造函数/原型(prototype)函数添加值?