標籤:
在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,虛函數