关于纯虚函数
在定義和實現COM接口時,純虛函數有不可替代的作用。
舉個例子,可能有些牽強,但是能說明問題。
比如,我有一個類Animal,維護了一種動物形象,現在我要實現一個函數Draw,把這個動物畫到任意一種介質上,這種介質可能是屏幕也可能是位圖,當然,在屏幕和位圖上畫圖形肯定是不一樣的,那么,我的Draw函數肯定要有一個介質參數,每種介質對應一個版本的Draw函數,這樣很麻煩,有了純虛函數,就完全可以定義一個抽象類,以這個抽象類為參數,只寫一個版本的Draw函數就可以了。
這個抽象類就是把在屏幕和位圖上的繪圖行為抽象出來,有點類似GDI+中的Graphics類(但它不是個抽象類)的概念,這個類定義有DrawRect和DrawText等純虛函數,但是不去實現它,而是讓針對屏幕繪圖的子類和針對位圖繪圖的子類去實現這些函數。
這樣所有像Animal的成員函數Draw那樣,需要繪圖的函數,都只需要有一個抽象類的指針或者引用,就可以繪圖了,這就是純虛函數的意義。?
再舉個偽代碼的例子:
class Animal
{
public:
virtual SayHi() = 0; //無法實現,也沒有必要實現。當然寫個空的虛函數也行,但是萬一我的函數需要返回值怎么辦?強行寫個返回值?C++的設計者當然不會允許這種情況出現。
完全可以沒有數據成員,因為本來它就是抽象的類,其實也就是接口。
};
class Dog : public Animal
{
public:
virtual SayHi() { cout << lang; }
private:
string lang = "wang wang";
};
class Cat : public Animal
{
public:
virtual SayHi() { cout << "miao miao"; }
};
//雖然抽象類不能實例化,但是可以用它的引用或者指針,這就是純虛函數能被利用的關鍵
這個函數只需要個動物參數,而動物類的所有函數在沒有被具體到或者說繼承到某個動物身上時是無法被實現的,但是所有的具體動物都可以作為參數傳給我的函數,而且只要是動物傳進來,不管是什么動物,我的函數都能正常的工作,這就是純虛函數或者說抽象類的意義。
void WhatAnimal(Animal &a)
{
a.SayHi();
}
class C
{
Animal *a;
};
來自百度:http://zhidao.baidu.com/question/157219602.html?qbl=relate_question_3&word=%B4%BF%D0%E9%B7%BD%B7%A8%D3%D0%CA%B2%C3%B4%D7%F7%D3%C3
轉載于:https://www.cnblogs.com/ll-10/p/5372418.html
總結
- 上一篇: 一周学会Mootools 1.4中文教程
- 下一篇: atitit.jQuery Valida