|
C++預設函式成員都不是虛擬函式,如果要將某個函式成員宣告為虛擬函式,則要加上"virtual"關鍵字,然而C++提供一種語法定義「純虛擬函式」
(Pure virtual
function),指明某個函式只是提供一個介面,要求繼承的子類別必須重新定義該函式,定義純虛擬函式除了使用關鍵字"virtual"之外,要在函
式定義之後緊跟著'='並加上一個0,例如: class
Some {
public: // 純虛擬函式 virtual void someFunction() = 0; .... }; 一個類別中如果含有虛擬函式,則該類別為一「抽象類別」(Abstract class),該類別只能被繼承,而不能用來直接生成實例,如果試圖使用一個抽象類別來生成實例,則會發生編譯錯誤。 以下舉個實際的例子,先假設您設計了兩個類別:ConcreteCircle與HollowCircle: class
ConcreteCircle {
public: void radius(double radius) { _radius = radius; } double radius() { return _radius; } void render() { cout << "畫一個半徑 " << _radius << " 的實心圓" << endl; } private: double _radius; }; class
HollowCircle {
public: void radius(double radius) { _radius = radius; } double radius() { return _radius; } void render() { cout << "畫一個半徑 " << _radius << " 的空心圓" << endl; } private: double _radius; }; 顯然的,這兩個類別除了render()方法的實作內容不同之外,其它的定義是一樣的,而且這兩個類別所定義的顯然都是「圓」的一種類型,您可以定義一個 抽象的AbstractCircle類別,將ConcreteCircle與HollowCircle中相同的行為與定義提取(Pull up)至抽象類別中:
#ifndef ABSTRACTCIRCLE 注意到在類別宣告了虛擬函式render(),所以AbstractCircle是個抽象類別,它只能被繼承,繼承了AbstractCircle的類別 必須實作render()函式,接著您可以讓ConcreteCircle與HollowCircle類別繼承AbstractCircle方法並實作 render()函式:
#include <iostream>
#include <iostream> 由於共同的定義被提取至AbstractCircle類別中,並於衍生類別中繼承了下來,所以在ConcreteCircle與HollowCircle 中無需重覆定義,只要定義個別對render()的處理方式就行了,而由於ConcreteCircle與HollowCircle都是 AbstractCircle的子類別,因而可以使用AbstractCircle上所定義的虛擬操作介面,來操作子類別實例上的方法,如下所示:
#include <iostream> 執行結果:
|