多態性
多態性是面向對象程序設計的重要特性之一,從字面意思上可以簡單理解就是:多種形態,多個樣子。其實本質意思也是這樣,在面向對象程序設計中,指同樣的方法被不同對象執行時會有不同的執行效果。
成人app在具體來說,多態的實現又可以分為兩種:編譯時多態和運行時的多態。前者是編譯的時候就確定了具體的操作過程。后者呢是在程序運行過程中才確定的操作過程。這種確定操作過程的就是聯編,也稱為綁定。
成人app聯編在編譯和連接時確認的,叫做靜態聯編,前面我們學習的函數重載、函數模板的實例化就屬于這一類。
另一種是在運行的時候,才能確認執行哪段代碼的,叫做動態聯編,這種情況是編譯的時候,還無法確認具體走哪段代碼,而是程序運行起來之后才能確認。
成人app兩者相比之下,靜態聯編由于編譯時候就已經確定好怎么執行,因此執行起來效率高;而動態聯編想必雖然慢一些,但優點是靈活。
成人app兩者各有千秋,有各自不同的使用場景。
成人app下面,我們圍繞靜態聯編,給大家舉一個簡單例子:
/************************************** //Des:C++教程demo //Author:Huang //Copyright:hnsaiyang.com //Date:2017/12/20 **************************************/ #include <iostream> 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; } 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; }
成人app定義了兩個類,一個圓點類,一個派生出來的圓類,可以看到主函數的代碼,四個輸出面積的結果,結果如下:
成人app大家可以對照代碼理解四個輸出
成人app第一個cout輸出A的面積,是Point類中的area方法,面積為0,沒有問題。
成人app第二個cout輸出B的面積,很明顯是派生類Circle的area方法,面積自然按公式計算得出1256.64的值,也沒問題。
第三個cout輸出的是Point類型指針p指向的Circle類對象的area方法,它輸出了0很明顯是執行了Point類里的area方法。這里C++實行的是靜態聯編,即在編譯的時候就依據p的類型來定執行哪個area,因此是0
成人app第四種cout也同理,把Circle類型的對象賦給Point類型的引用,C++同樣實行靜態聯編,也輸出0
很明顯,這不是我們更期望的結果,實際上,對于指針、引用,我們更希望執行實際對象的方法,而不是因為這個指針、引用的類型而盲目的確定。這就是如果這么寫存在的問題。
如果想達到我們的要求,即無論指針和引用為什么類型,都以實際所指向的對象為依據靈活決定。那么就要更改這種默認的靜態聯編的方法,采用動態聯編,即在運行的時候靈活決定。
下一節,虛函數為大家詳細解釋!
本文固定URL:http://hnsaiyang.com/course/79