簡略解讀C++中的虛函數。本站提示廣大學習愛好者:(簡略解讀C++中的虛函數)文章只能為提供參考,不一定能成為您想要的結果。以下是簡略解讀C++中的虛函數正文
虛函數
簡略地說,那些被virtual症結字潤飾的成員函數,就是虛函數。虛函數的感化,用專業術語來說明就是完成多態性(Polymorphism),多態性是將接口與完成停止分別;用抽象的說話來說明就是完成以配合的辦法,但因個別差別而采取分歧的戰略。上面來看一段簡略的代碼
class A{ public: void print(){ cout<<”This is A”<<endl;} }; class B:public A{ public: void print(){ cout<<”This is B”<<endl;} }; int main(){ //為了在今後便於辨別,我這段main()代碼叫做main1 A a; B b; a.print(); b.print(); }
經由過程class A和class B的print()這個接口,可以看出這兩個class因個別的差別而采取了分歧的戰略,輸入的成果也是我們預感中的,分離是This is A和This is B。但這能否真正做到了多態性呢?No,多態還有個症結的地方就是一切用指向基類的指針或援用來操尴尬刁難象。那如今就把main()處的代碼改一改。
int main() { //main2 A a; B b; A* p1=&a; A* p2=&b; (這裡強行用指向基類的指針來操作衍生的對象) p1->print(); p2->print(); }
運轉一下看看成果,喲呵,蓦然回想,成果倒是兩個This is A。成績來了,p2明明指向的是class B的對象但倒是挪用的class A的print()函數,這不是我們所希冀的成果,那末處理這個成績就須要用到虛函數
class A { public: virtual void print() { cout<<”This is A”<<endl;} }; class B:public A { public: void print() { cout<<”This is B”<<endl;} };
毫無疑問,class A的成員函數print()曾經成了虛函數,那末class B的print()成了虛函數了嗎?答復是Yes,我們只需在把基類的成員函數設為virtual,其派生類的響應的函數也會主動變成虛函數。所以,class B的print()同樣成了虛函數。那末關於在派生類的響應函數前能否須要用virtual症結字潤飾,那就是你本身的成績了。
如今從新運轉main2的代碼,如許輸入的成果就是This is A和This is B了。
如今來消化一下,我作個簡略的總結,指向基類的指針在操作它的多態類對象時,會依據分歧的類對象,挪用其響應的函數,這個函數就是虛函數。
純虛函數
虛函數的聲明以=0停止,即可將它聲明為純虛函數。包括純虛函數的類不許可實例化,稱為籠統類。 現實上純虛函數供給了面向對象中接口的功效。固然,如許的接口是以繼續的方法完成的。
class CPerson{ public: virtual void hello() = 0; }; CPerson p; // compile error
留意空辦法、純虛函數、辦法聲明的差別。類聲明中的空辦法給出了辦法聲明+辦法界說。 只聲明但沒有界說的辦法將會發生鏈接錯,不管能否被挪用過。
class CPerson{ public: void empty(){}; void declare(); }; CPerson::declare(){ // ... };