是否有一種方法可以在C++中顯式聲明基類爲抽象類?顯式聲明抽象基類
我知道我可以在類中創建一個純虛函數,它將隱式地聲明一個類爲抽象類。但是,我不想創建一個虛擬函數來定義派生類。
我也可以使受保護的構造函數,它會阻止對象的實例,但實際上並沒有將類標記爲抽象的。
那麼,有沒有辦法做到這一點? (我使用C++ 11,如果添加了一個辦法做到這一點,但我沒有發現任何疑似右)
是否有一種方法可以在C++中顯式聲明基類爲抽象類?顯式聲明抽象基類
我知道我可以在類中創建一個純虛函數,它將隱式地聲明一個類爲抽象類。但是,我不想創建一個虛擬函數來定義派生類。
我也可以使受保護的構造函數,它會阻止對象的實例,但實際上並沒有將類標記爲抽象的。
那麼,有沒有辦法做到這一點? (我使用C++ 11,如果添加了一個辦法做到這一點,但我沒有發現任何疑似右)
可以使析構函數純虛。因爲你總是需要一個析構函數,也沒有額外的心理成本:
struct Foo
{
virtual ~Foo() = 0;
};
inline Foo::~Foo() { }
(你做當然需要析構函數的實現,所以你必須提供一個離線)
你仍然可以使析構函數protected
,這是遵循「make non-leaf classes abstract」規則的良好實踐。
實施例:
struct Bar : Foo { };
// Foo f; // Error, Foo is abstract
Bar b; // OK
有一種方法,以顯式地聲明基類如C++抽象?
沒有,沒有。一個類只有在其中至少包含一個抽象方法時纔是抽象的。如果你不想讓你的基類直接實例化,那麼受保護的構造函數是一個不錯的選擇。
我喜歡Kerrek的回答。這樣該類不能被實例化,因此是抽象的。
但是,它仍然是沒有明顯的清楚,是一個抽象類,除非你通過掃描類的整個聲明,看到析構函數是虛擬的。
另一個想法我已經是你可以創建使用#define
單詞「抽象」的預處理器定義。這樣,你可以這樣做以下:
abstract struct Foo {};
這將是沒有什麼不同
struct Foo {};
我這個看到的問題是,這並不強制類是抽象的,所以你可以使用宏來聲明虛擬析構函數。喜歡的東西:
#define ABSTRACT_CLASS(class_name) \
class class_name { \
virtual ~class_name() = 0; //
,然後用它像這樣:
ABSTRACT_CLASS(Foo) {
// class declaration
};
這將變成:
class foo {
virtual ~class_name() = 0; // {
// class declaration
};
免責聲明:我的宏可能會稍微偏離。我不確定它是否實際上將class_name和〜和()接觸到變量名稱。另外,我不確定自己是否會這樣做,這不是最美麗的解決方案,尤其是對大括號進行評論,因爲如果將其放在下一行上,這樣做不起作用。但你問過你如何標記抽象的東西,然後把它交給你!
哇,那有用嗎?如同在'Bar'被解構時,'Foo'解構器仍然會被調用? – Xymostech
@Xymostech:自然地:-)(您可以提供* any *純虛函數的定義。) –
有趣。看起來Clang給出了一個警告:'注意:當你嘗試創建一個'Foo'時,'注意:'Foo'中未實現的純虛擬方法'〜Foo',但它很好用! – Xymostech