2012-11-14 163 views
2

是否有一種方法可以在C++中顯式聲明基類爲抽象類?顯式聲明抽象基類

我知道我可以在類中創建一個純虛函數,它將隱式地聲明一個類爲抽象類。但是,我不想創建一個虛擬函數來定義派生類。

我也可以使受保護的構造函數,它會阻止對象的實例,但實際上並沒有將類標記爲抽象的。

那麼,有沒有辦法做到這一點? (我使用C++ 11,如果添加了一個辦法做到這一點,但我沒有發現任何疑似右)

回答

3

可以使析構函數純虛。因爲你總是需要一個析構函數,也沒有額外的心理成本:

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 
+0

哇,那有用嗎?如同在'Bar'被解構時,'Foo'解構器仍然會被調用? – Xymostech

+0

@Xymostech:自然地:-)(您可以提供* any *純虛函數的定義。) –

+0

有趣。看起來Clang給出了一個警告:'注意:當你嘗試創建一個'Foo'時,'注意:'Foo'中未實現的純虛擬方法'〜Foo',但它很好用! – Xymostech

1

有一種方法,以顯式地聲明基類如C++抽象?

沒有,沒有。一個類只有在其中至少包含一個抽象方法時纔是抽象的。如果你不想讓你的基類直接實例化,那麼受保護的構造函數是一個不錯的選擇。

1

我喜歡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和〜和()接觸到變量名稱。另外,我不確定自己是否會這樣做,這不是最美麗的解決方案,尤其是對大括號進行評論,因爲如果將其放在下一行上,這樣做不起作用。但你問過你如何標記抽象的東西,然後把它交給你!