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

Yua*_*Wen 0 c++ constructor pure-virtual

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

派生类的构造函数都需要调用reset()具有相同签名的函数。结果,我想virtual void reset() = 0在基类中将纯虚函数声明为Interface。

但是,问题是:

不应在Constructor中调用虚函数。

但是我想reset()成为基类提供的接口。这样所有派生类都必须分别实现reset。

我该怎么办?

The*_*tor 5

而不是强迫他们调用一个函数(无论如何您都不能保证),而是使基类构造函数期望一个包含所需行为的参数。

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


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

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

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

class Derived : public Base
{
public:
    void reset() override
    {
        setValue(20);
    }
};
Run Code Online (Sandbox Code Playgroud)

您可以改为:

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)
    {
    }
};
Run Code Online (Sandbox Code Playgroud)