派生 classes 的构造函数调用的函数在基础 class 中不应该是纯虚拟的

function called by constructors of derived classes not supposed to be pure virtual in base class

我有一个基础 class 和许多派生的 class。

derivedclasses的构造函数都需要调用同一个签名的函数reset()。因此,我想在 base class 中声明一个纯虚函数 virtual void reset() = 0 作为接口。

但是,问题是:

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

但我希望reset()成为基础class提供的接口。这样所有派生的classes都要分别实现reset。

我该怎么办?

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

这样,基础 class 就是 self-contained 并且在其构造函数运行时拥有所有必需的信息。


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

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

您可以创建工厂:

struct Base
{
    virtual ~Base() = default;
    virtual void reset() = 0;

    template <typename Der, typename ... Ts>
    static std::unique_ptr<Der> Make(Ts&&... args)
    {
        static_assert(std::is_base_of<Base, Der>::value, "!");
        auto p = std::make_unique<Der>(std::forward<Ts>(args)...);
        p->reset();
        return p;
    }
};

struct Derived
{
    void reset() override { /*..*/ }
};