抽象類
來自 cppreference.com
定義一個不能被例項化但可作為基類的抽象型別。
目錄 |
[編輯] 語法
宣告符 虛說明符 (可選) = 0 |
|||||||||
這裡的序列 = 0
被稱為 純說明符,它出現在 宣告符 之後,或在可選的 虛說明符(override
或 final
)之後。
純說明符 不能出現在成員函式定義或 友元 宣告中。
struct Base { virtual int g(); virtual ~Base() {} }; struct A : Base { // OK: declares three member virtual functions, two of them pure virtual int f() = 0, g() override = 0, h(); // OK: destructor can be pure too ~A() = 0; // Error: pure-specifier on a function definition virtual int b() = 0 {} };
一個 抽象類 是一個類,它定義或繼承了至少一個函式,該函式的 最終覆蓋器 是 純虛 的。
[編輯] 解釋
抽象類用於表示通用概念(例如,形狀、動物),它們可以作為具體類(例如,圓形、狗)的基類。
不能建立抽象類的物件(除了從它派生的類的基子物件),也不能宣告型別為抽象類的非靜態資料成員。
抽象型別不能用作引數型別、函式返回型別或顯式轉換的型別(請注意,這在定義和函式呼叫點進行檢查,因為在函式宣告點,引數和返回型別可能不完整)。
可以宣告指向抽象類的指標和引用。
執行此程式碼
struct Abstract { virtual void f() = 0; // pure virtual }; // "Abstract" is abstract struct Concrete : Abstract { void f() override {} // non-pure virtual virtual void g(); // non-pure virtual }; // "Concrete" is non-abstract struct Abstract2 : Concrete { void g() override = 0; // pure virtual overrider }; // "Abstract2" is abstract int main() { // Abstract a; // Error: abstract class Concrete b; // OK Abstract& a = b; // OK to reference abstract base a.f(); // virtual dispatch to Concrete::f() // Abstract2 a2; // Error: abstract class (final overrider of g() is pure) }
可以提供純虛擬函式的定義(如果純虛擬函式是解構函式,則必須提供):派生類的成員函式可以使用限定函式ID自由地呼叫抽象基類的純虛擬函式。此定義必須在類體之外提供(函式宣告的語法不允許同時存在純說明符= 0
和函式體)。
從抽象類的建構函式或解構函式對純虛擬函式進行虛呼叫是未定義行為(無論它是否有定義)。
struct Abstract { virtual void f() = 0; // pure virtual virtual void g() {} // non-pure virtual ~Abstract() { g(); // OK: calls Abstract::g() // f(); // undefined behavior Abstract::f(); // OK: non-virtual call } }; // definition of the pure virtual function void Abstract::f() { std::cout << "A::f()\n"; } struct Concrete : Abstract { void f() override { Abstract::f(); // OK: calls pure virtual function } void g() override {} ~Concrete() { g(); // OK: calls Concrete::g() f(); // OK: calls Concrete::f() } };
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
CWG 390 | C++98 | 可能呼叫未定義的純虛解構函式 | 在這種情況下需要提供定義 |
CWG 2153 | C++98 | 純說明符 可能出現在友元宣告中 | 已禁止 |