Share via


抽象類別 (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 的解構函式。 編譯器會產生程式碼,以在解構函式之後隱含呼叫 類別 basederived 解構函式。 純虛擬函 ~base 式的空實作可確保函式至少有一些實作存在。 如果沒有它,連結器就會為隱含呼叫產生無法解析的外部符號錯誤。

注意

在上述範例中,純虛擬函式 base::~base 是從 derived::~derived 隱含呼叫。 您也可以使用完整成員函式名稱明確呼叫純虛擬函式。 這類函式必須具有實作,或呼叫會在連結時產生錯誤。

另請參閱

繼承