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

时间:2016-10-03 17:49:48

标签: 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;
}

此类的目的是实现一个基本计数器对象,其目的是必须继承它。除了析构函数之外,它没有任何虚拟方法,更重要的是,不会初始化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);
}

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

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

2 个答案:

答案 0 :(得分:13)

  

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

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

答案 1 :(得分:4)

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

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

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

顺便说一下,您目前在代码中的评论是100%无用的视觉噪音。 get next对名为get_next的函数的评论完全没有任何用处。