考虑以下课程:
//! 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
的实例?
答案 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
的函数的评论完全没有任何用处。