C++學習筆記26,虛函數

來源:互聯網
上載者:User

標籤:

在C++裡面,虛擬功能是功能的一類重要!不同目的可以通過在不同的虛擬功能來達到同樣的動作被定義。

舉一個簡單的例子:

#include <iostream>#include <string>using namespace std;class Animal{protected:string name;public:Animal(const string &s):name(s){}virtual ~Animal(){}virtual void speak()const{cout<<"I'm a Animal!"<<endl;}};class Dog:public Animal{public:Dog(const string &s):Animal(s){}virtual ~Dog(){}virtual void speak()const override{cout<<"This's a Dog!"<<endl;}};int main(){Animal a("AnimalOne");Dog d1("DogOne");
<span style="white-space:pre"></span>//用指標調用speak()Animal *p1=&a;Animal *p2=&d1;p1->speak();p2->speak();<span style="white-space:pre"></span>//用引用調用speak()Animal &r1=a;Animal &r2=d1;r1.speak();r2.speak();return 0;}
結果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

能夠看出,通過指標和引用能夠調用相應的虛函數.即便指標和引用都聲明為Animal 類型,可是卻能夠調用相應的函數(Dog::speak()).

因此,假設須要在衍生類別中又一次定義基類的方法,應該將該方法設定為虛方法.

須要注意的是僅僅有指標和引用才幹正確引發對應的虛函數.同一時候函數必須聲明為虛的.假設不是的話,將僅僅會調用對應的類成員函數.

比如:

#include <iostream>#include <string>using namespace std;class Animal{protected:string name;public:Animal(const string &s):name(s){}virtual ~Animal(){}void speak()const{cout<<"I'm a Animal!"<<endl;}};class Dog:public Animal{public:Dog(const string &s):Animal(s){}virtual ~Dog(){}void speak()const {cout<<"This's a Dog!"<<endl;}};int main(){Animal a("AnimalOne");Dog d1("DogOne");Animal *p1=&a;Animal *p2=&d1;p1->speak();p2->speak();Animal &r1=a;Animal &r2=d1;r1.speak();r2.speak();return 0;}
執行結果:


假設成員函數不是虛的,就不能達到這種效果.這就是動態綁定.

再看一個範例:

#include <iostream>#include <string>using namespace std;class Animal{protected:string name;public:Animal(const string &s):name(s){}virtual ~Animal(){}//非虛函數void eat()const{cout<<"Animal eat!"<<endl;}//不被重寫的虛函數 virtual void run()const{cout<<"Animal run!"<<endl;}//會被重寫的虛函數virtual void speak()const{cout<<"I'm a Animal!"<<endl;}};class Dog:public Animal{public:Dog(const string &s):Animal(s){}virtual ~Dog(){}//新定義的函數eat,將掩蓋舊的版本號碼,非重寫(重寫是指重寫virtual函數)void eat()const{cout<<"Dog eat!"<<endl;}//重寫speak()virtual void speak()const override{cout<<"This's a Dog!"<<endl;}};int main(){Animal a("AnimalOne");Dog d1("DogOne");Animal *p1=&a;Animal *p2=&d1;p1->speak();p2->speak();p1->eat();p2->eat();//call Animal::eat()p1->run();p2->run();//call Animal::run()Animal &r1=a;Animal &r2=d1;r1.speak();r2.speak();r1.eat();r2.eat();r1.run();r2.run();return 0;}

結果:





著作權聲明:本文部落格原創文章,部落格,未經同意,不得轉載。

C++學習筆記26,虛函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.