C++課程第五次博客——多態

多態性

Part1 多態性概述

多態是指一樣的消息被不一樣類型的對象接收時致使不一樣的行爲。在C++中,所謂信息是指對類的成員函數的調用,不一樣的行爲是指不一樣的實現,也就是調用了不一樣的函數。函數

1)多態的類型

分爲四類:重載多態,強制多態,包含多態和參數多態。前二者爲專用多態,然後者稱爲通用多態。this

2)多態的實現

分爲兩類:編譯時的多態和運行時的多態。spa

前者是在編譯的過程當中肯定了同名操做的具體操做對象設計

後者則是在程序運行過程當中纔多態肯定操做所針對的具體對象指針

這種肯定操做的具體對象的過程就是綁定,綁定是指計算機程序自身彼此關聯的過程,也就是把一條信息和一個對象相結合的過程。綁定工做在編譯鏈接階段完成的狀況稱爲靜態綁定,例如重載,強制和參數多態。而綁定工做在程序運行階段完成的狀況稱爲動態綁定,例如多態操做對象的肯定經過動態綁定完成。code

Part2 多態實驗

在多態性中,運算符重載、虛函數、純虛函數和抽象類是相對來講難以理解的,下面咱們主要將對這些知識點,設計實驗並探索。對象

運算符重載

第一注意點blog

當運算符重載爲類的成員函數時,函數的參數個數比原來的操做數個數要少一個(後置「++」,「--」除外)接口

#include <iostream>
using namespace std;
class fun{
private:
    double x,y;
public:
    fun(double x=0,double y=0):x(x),y(y){};
    fun operator+(const fun &c1,const fun &c2)const;   //當重載函數爲重載函數時,傳進兩個無名對象
    void displat()const;
};

結果編譯器直接報錯:Overloaded 'operator+' must be a unary or binary operator (has 3 parameters)

當operator+改爲只傳進一個參數時,編譯經過。

緣由:類的this指針所指的對象默認穿進去。

虛函數

虛函數是動態綁定的基礎。虛函數必須是非靜態的成員函數。虛函數通過派生以後,在類族中就能夠實現運行過程當中的多態

第二注意點:

由成員函數來調用或者是經過指針、引用來訪問虛函數

#include <iostream>
using namespace std;
//類的聲明和實現
class base1{
public:
    virtual void display()const;        //虛函數
};
void base1::display() const{
    cout<<"Base1::display"<<endl;
}
class base2:public base1{
public:
    void display() const;
};
void base2::display()const{
    cout<<"base2::display"<<endl;
}
class Derived:public base2{
public:
    void display() const;
};
void Derived::display()const{
    cout<<"Derived::display"<<endl;
}
//經過對象名來訪問虛函數
int main(){
    base1 base1;
    base2 base2;
    Derived derived;
    base1.display();
    base2.display();
    derived.display();
    return 0;
}

結果輸出正確:

可是用這個方式來訪問虛函數,則是綁定在編譯過程當中,而不是在運行過程當中進行。若是要實現多態綁定,須要用指針,使程序更加靈活。

void fun(base1 *ptr){
    ptr->display();
}

純虛函數和抽象類

帶純虛函數的類是抽象類,抽象類聲明瞭一個類族派生類的共同接口,而接口的完整實現,即純虛函數的函數體,要由派生類本身定義。

#include <iostream>
using namespace std;
class base1{
public:
    virtual void display()const=0;        //純虛函數
};
class base2:public base1{
public:
    void display1() const;                              //沒有去定義抽象的函數體
};
void base2::display1()const{
    cout<<"base2::display1"<<endl;
}

報錯:Out-of-line definition of 'display1' does not match any declaration in 'base2'

將display1修改成display編譯經過。

並且在程序中的虛函數並無用virtual關鍵字顯性聲明,二是編譯器經過派生類有着與抽象基類的純虛函數相同的名稱、參數以及返回值,來自動肯定其爲虛函數。

Part3 總結

經過定義同一名稱操做,當面對不一樣數據時實現不一樣的功能。使程序的功能實現更加靈活。

相關文章
相關標籤/搜索