成人app

首頁  /  C++教程  /  多態性概述  /  

多態性概述

點擊打開在線編譯器,邊學邊練

多態性

 

多態性是面向對象程序設計的重要特性之一,從字面意思上可以簡單理解就是:多種形態,多個樣子。其實本質意思也是這樣,在面向對象程序設計中,指同樣的方法被不同對象執行時會有不同的執行效果。

 

 

成人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定義了兩個類,一個圓點類,一個派生出來的圓類,可以看到主函數的代碼,四個輸出面積的結果,結果如下:

601.png

成人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

下一課:虛函數
Dotcpp在線編譯      (登錄可減少運行等待時間)