我可以强制继承一个类吗?

Kar*_*oll 4 c++ inheritance

考虑以下课程:

//! Counter class base. Must be inherited.
class base_seeded_counter
{
public:
    //! Destructor
    virtual ~base_seeded_counter() { };

    //! Get the next value.
    int get_next();

protected:
    //! Override the counter next value.
    void set_next(const int next);

private:
    int m_next_value;    // Next value.
}

// ------------------------------------------------------

inline int base_seeded_counter::get_next()
{
    return m_next_value++;
}

// ------------------------------------------------------

inline void base_seeded_counter::set_next(const int next)
{
    m_next_value = next;
}
Run Code Online (Sandbox Code Playgroud)

此类的目的是实现一个基本计数器对象,其目的是必须继承它.除了析构函数之外,它没有任何虚方法,更重要的是,它不会初始化m_next_value成员.这是派生类的工作.例如:

class file_seeded_counter : public base_seeded_counter
{
public:
    file_seeded_counter(const std::string &file_name);

    void reseed();

private:
    std::string m_file_name;
}

inline int file_seeded_counter::file_seeded_counter(const std::string &file_name) :
    m_file_name(file_name)
{
    reseed();
}

inline void file_seeded_counter::reseed()
{
    int seed_from_file;

    // open file here and get seed value...

    set_next(seed_from_file);
}
Run Code Online (Sandbox Code Playgroud)

此类派生自base_seeded_counter,从文件中读取初始计数器值,并提供通过该reseed()方法从文件中重新读取种子的功能.例如,可能有其他类提供与数据库,网络源或PRNG的种子类似的功能.

我的问题是:鉴于我没有纯虚方法,C++是否提供了一种机制来阻止某人创建一个实例base_seeded_counter

πάν*_*ῥεῖ 13

我的问题是:鉴于我没有纯虚方法,C++是否提供了一种机制来阻止某人创建一个实例base_seeded_counter

是的,给它一个protected默认的构造函数(可能是空的).


Jer*_*fin 5

鉴于您已经有一个虚拟析构函数,显而易见的方法是将其声明为纯虚拟的。拥有一个也在基类中定义的纯虚拟析构函数是完全合法的:

class base_seeded_counter {
public:
    virtual ~base_seeded_counter() = 0;
    int get_next();
protected:
    void set_next(const int next);
private:
    int m_next_value;
}

inline virtual base_seeded_counter::~base_seeded_counter() {}
Run Code Online (Sandbox Code Playgroud)

以这种方式定义析构函数并不会改变它是纯虚拟的事实,因此该类无法实例化。


顺便说一句,您当前在代码中的注释是 100% 无用的视觉噪音。get next对名为 的函数的注释get_next根本没有添加任何有用的内容。