虛擬函式
首先引出,我們的新知識點—虛擬函式(virtual function)
這是一種什麼函式呢? 簡單講,就是一個函式前面用virtual宣告的函式,一般形式如下:
virtual 函式返回值 函式名(形參)
{
函式體
}
那它有什麼用呢? 虛擬函式的出現,允許函式在呼叫時與函式體的聯絡在執行的時候才建立,即所謂的動態聯編。那麼在虛擬函式的派生類的執行時候,就可以在執行的時候根據動態聯編實現都是執行一個方法,卻出現不同結果的效果,就是所謂的多型。這樣解決上一節的問題就有了辦法。
接下來,我們只需要把基類中的area方法宣告為虛擬函式,那麼主函式中無論Point型別的指標還是引用就都可以大膽呼叫,無用關心型別問題了。因為他們會依據實際指向的物件型別來決定呼叫誰的方法,來實現動態聯編。
程式碼如下:
/********************************** //Des:C++教程demo //Author:Huang //Copyright:www.dotcpp.com //Date:2017/12/20 **********************************/
include
using namespace std;
define PI 3.1415926
class Point { private: int x,y;
public: Point(int x=0,int y=0) { this->x = x; this->y = y; } virtual double area() { return 0.0; } }; class Circle:public Point { private: int r; public: Circle(int x,int y,int R):Point(x,y) { r = R; } double area() { return PI*r*r; } };
int main() {
Point A(10,10);
cout<<A.area()<<endl;
Circle B(10,10,20);
cout<<B.area()<<endl;
Point *p;
p = &B;
cout<<p->area()<<endl;
Point &pp=B;
cout<<pp.area()<<endl;
return 0;
} 修改後編譯執行如下:
602.png
大家請自行上機實驗,體會虛擬函式及多型的作用。
需要注意的是:
虛擬函式不能是靜態成員函式,或友元函式,因為它們不屬於某個物件。
行內函數不能在執行中動態確定其位置,即使虛擬函式在類的內部定義,編譯時,仍將看作非內聯,
建構函式不能是虛擬函式,解構函式可以是虛擬函式,而且通常宣告為虛擬函式。
相關文章
- 虛擬函式,虛擬函式表函式
- 虛擬函式 純虛擬函式函式
- 介面、虛擬函式、純虛擬函式、抽象類函式抽象
- C++中抽象類、虛擬函式和純虛擬函式C++抽象函式
- C++中的虛擬函式與虛擬函式表 (轉)C++函式
- 【C++筆記】虛擬函式(從虛擬函式表來解析)C++筆記函式
- 【C++筆記】虛擬函式(從虛擬函式概念來解析)C++筆記函式
- C++ 虛擬函式C++函式
- C++虛擬函式C++函式
- 虛擬函式釋義函式
- c++虛擬函式表C++函式
- 虛擬函式的呼叫原理函式
- C++虛擬函式bugC++函式
- 虛擬函式與多型函式多型
- 虛擬函式的實現原理函式
- C++ 介面(純虛擬函式)C++函式
- C++ 中的虛擬函式C++函式
- C++ 虛擬函式表剖析C++函式
- C++ 虛擬函式表解析C++函式
- const修飾虛擬函式函式
- 虛擬函式實現原理(轉)函式
- [CareerCup] 13.3 Virtual Functions 虛擬函式Function函式
- C++多型(上)——虛擬函式、虛表C++多型函式
- 深入C++成員函式及虛擬函式表C++函式
- C++箴言:避免解構函式呼叫虛擬函式C++箴言函式
- 抽象基類和純虛擬函式抽象函式
- C++多型之虛擬函式C++多型函式
- C++中虛擬函式的作用C++函式
- C++虛擬函式解析(轉載)C++函式
- C++ 虛擬函式和虛繼承淺析C++函式繼承
- C++ Daily 《3》----建構函式可否是虛擬函式C++AI函式
- 【虛擬函式】C++中虛擬函式的作用是什麼?它應該怎麼用呢?[轉]函式C++
- C++虛擬函式學習總結C++函式
- C++繼承二之虛擬函式C++繼承函式
- C++ 繼承、多型、虛擬函式C++繼承多型函式
- C++中的虛擬函式(virtual function)C++函式Function
- C++:純虛擬函式與抽象類C++函式抽象
- C++函式中那些不可以被宣告為虛擬函式的函式C++函式