抽象類別用於表示可衍生更明確類別的一般概念。 您無法建立抽象類類型的物件。 不過,您可以使用抽象類類型的指標和參考。
您可以宣告至少一個純虛擬成員函式,以建立抽象類。 這是使用純規範 (= 0
) 語法宣告的虛擬函式。 衍生自抽象類別的類別必須實作純虛擬函式,否則這些類別也是抽象類別。
請考慮虛擬函式中顯示的範例。 Account
類別的目的是要提供一般功能,但 Account
類型的物件則過於籠統,實用性不高。 這表示 Account
是抽象類的好候選專案:
// deriv_AbstractClasses.cpp
// compile with: /LD
class Account {
public:
Account( double d ); // Constructor.
virtual double GetBalance(); // Obtain balance.
virtual void PrintBalance() = 0; // Pure virtual function.
private:
double _balance;
};
此宣告和上一個宣告之間唯一的差別,在於 PrintBalance
是使用純指定名稱 (= 0
) 宣告的。
抽象類別的限制
抽象類無法用於:
變數或成員資料
引數類型
函式傳回型別
明確轉換的類型
如果抽象類的建構函式會直接或間接呼叫純虛擬函式,則結果為未定義。 不過,抽象類別的建構函式和解構函式可以呼叫其他成員函式。
定義的純虛擬函式
抽象類中的純虛擬函式可以 定義或具有實作。 您只能使用完整語法來呼叫這類函式:
abstract-class-name::function-name()
當您設計基類包含純虛擬解構函式的類別階層時,定義的純虛擬函式會很有説明。 這是因為基類解構函式一律會在物件解構期間呼叫。 請考慮下列範例:
// deriv_RestrictionsOnUsingAbstractClasses.cpp
// Declare an abstract base class with a pure virtual destructor.
// It's the simplest possible abstract class.
class base
{
public:
base() {}
// To define the virtual destructor outside the class:
virtual ~base() = 0;
// Microsoft-specific extension to define it inline:
// virtual ~base() = 0 {};
};
base::~base() {} // required if not using Microsoft extension
class derived : public base
{
public:
derived() {}
~derived() {}
};
int main()
{
derived aDerived; // destructor called when it goes out of scope
}
此範例示範Microsoft編譯程式延伸模組如何讓您將內嵌定義新增至純虛擬 ~base()
。 您也可以使用 base::~base() {}
在 類別之外定義它。
當物件 aDerived
超出範圍時,會呼叫 類別 derived
的解構函式。 編譯程式會產生程式代碼,以在解構函式之後隱含呼叫 類別 base
的 derived
解構函式。 純虛擬函 ~base
式的空實作可確保函式至少有一些實作存在。 如果沒有它,連結器就會為隱含呼叫產生無法解析的外部符號錯誤。
注意
在上述範例中,純虛擬函式 base::~base
是從 derived::~derived
隱含呼叫。 您也可以使用完整成員函式名稱明確呼叫純虛擬函式。 這類函式必須具有實作,或呼叫會在連結時產生錯誤。