一、概念:
在某基類中宣告為 virtual 并在一個或多個派生類中被重新定義的成員函式,用法格式為:virtual 函式回傳型別 函式名(引數表) {函式體};實作多型性,通過指向派生類的基類指標或參考,訪問派生類中同名覆寫成員函式,
二、定義:
簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式,虛函式的作用,用專業術語來解釋就是實作多型性(Polymorphism),多型性是將介面與實作進行分離;用形象的語言來解釋就是實作以共同的方法,但因個體差異,而采用不同的策略,
#include<iostream>
using namespace std;
class A
{
public:
void print()
{
cout<<"This is A"<<endl;
}
};
class B : public A
{
public:
void print()
{
cout<<"This is B"<<endl;
}
};
int main()
{
//main1
A a;
B b;
a.print();
b.print();
return 0;
}
運行結果:
分別是“This is A”、“This is B”,
通過class A和class B的print()這個介面,可以看出這兩個class因個體的差異而采用了不同的策略,但這并不是多型性行為(使用的是不同型別的指標),沒有用到虛函式的功能,為了實作多型,現在把main()函式改一改
int main()
{
//main2
A a;
B b;
A *p1 = &a;
A *p2 = &b;
p1->print();
p2->print();
return 0;
}
運行的結果卻是兩個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()也相應成了虛函式,我們只需在把基類的成員函式設為virtual,其派生類的相應的函式也會自動變為虛函式,所以,class B的print()也成了虛函式,對于在派生類的相應函式前是否需要用virtual關鍵字修飾,語法上可加可不加,不加的話編譯器會自動加上,但為了閱讀方便和規范性,建議加上,
現在重新運行main2的代碼,這樣輸出的結果就是This is A和This is B了,
三、 總結:
指向基類的指標在操作它的多型類物件時,會根據不同的類物件,呼叫其相應的函式,這個函式就是虛函式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/277717.html
標籤:其他
上一篇:漢諾塔遞回問題(C語言)
