抽象類別 (C++)
抽象類別用於表示可衍生更明確類別的一般概念。 您無法建立抽象類別類型的物件。 不過,您可以使用抽象類別類型的指標和參考。
您可以宣告至少一個純虛擬成員函式,以建立抽象類別。 這是使用純 規範 ( = 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
隱含呼叫。 您也可以使用完整成員函式名稱明確呼叫純虛擬函式。 這類函式必須具有實作,或呼叫會在連結時產生錯誤。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應