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