考慮以下類:我可以強迫一個類繼承嗎?
//! 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
的實例?
我可以問你**你爲什麼要達到這個目標?如果你創建一個抽象類,爲什麼它會打擾你,如果它會被實例化? – Majster
@majster - 好問題。我的例子中的類在技術上是抽象的,但是因爲它的所有方法都被實現了,所以編譯器把它看作一個具體的類。編譯器沒有看到的是'm_next_value'永遠不會被初始化,當計數器沒有返回預期的結果時可能會導致一些嚴重的問題。我的興趣在於確保其他開發人員不能像這樣做一些傻事:'base_seeded_counter foo;'並讓他們的代碼中斷。 –
不要依賴派生類來初始化'm_next_value'。在基類中將它初始化爲一些理智的東西,比如'0',並讓派生類將它重置爲他們選擇的值。 –