abstract (C++ 元件擴充功能)
abstract 關鍵字會宣告兩者中的任一個:
型別可以當做基底型別,但是型別本身無法執行個體化。
型別成員函式只能定義於衍生型別中。
所有平台
語法
class-declaration class-identifier abstract {}
virtual return-type member-function-identifier() abstract ;
備註
第一個範例語法會將類別宣告為抽象的。如果指定 /ZW 或 /clr 編譯器選項,則類別宣告元件可以是原生 C++ 宣告 (class 或 struct) 或 C++ 延伸宣告 (ref class 或 ref struct)。
第二個範例語法將虛擬成員函式宣告為抽象。宣告函式抽象就像是將其宣告為純虛擬函式一樣。宣告成員函式抽象也會使封入類別宣告為抽象。
abstract 關鍵字支援原生和平台特定程式碼,也就是,可以使用或不使用 /ZW 或 /clr 編譯器選項進行編譯。
您可以使用 __is_abstract(type) 型別特性,在編譯時期偵測型別是否為抽象。如需詳細資訊,請參閱型別特性的編譯器支援 (C++ 元件擴充功能)。
abstract 關鍵字是內容相關性覆寫規範。如需內容相關性關鍵字的詳細資訊,請參閱視內容而有所區別的關鍵字 (C++ 元件擴充功能)。如需覆寫規範的詳細資訊,請參閱HOW TO: 宣告原生編譯中的覆寫規範。
Windows 執行階段
如需詳細資訊,請參閱 Ref 類別與結構。
需求
編譯器選項:/ZW
Common Language Runtime
需求
編譯器選項:/clr
範例
範例
下列程式碼範例會產生錯誤,因為類別 X 是標記為 abstract。
// abstract_keyword.cpp
// compile with: /clr
ref class X abstract {
public:
virtual void f() {}
};
int main() {
X ^ MyX = gcnew X; // C3622
}
範例
下列程式碼範例會產生錯誤,因為對標記為 abstract 的原生類別進行了執行個體化。不論是否使用 /clr 編譯器選項,這個錯誤都會發生。
// abstract_keyword_2.cpp
class X abstract {
public:
virtual void f() {}
};
int main() {
X * MyX = new X; // C3622: 'X': a class declared as 'abstract'
// cannot be instantiated. See declaration of 'X'}
範例
下列程式碼範例會產生錯誤,因為函式 f 雖包含定義,但是標記為 abstract。範例中的最後一個陳述式顯示,宣告抽象虛擬函式相當於宣告純虛擬函式。
// abstract_keyword_3.cpp
// compile with: /clr
ref class X {
public:
virtual void f() abstract {} // C3634
virtual void g() = 0 {} // C3634
};