多型是指同樣的訊息被不同型別的物件接受時導致不同的行為。所謂訊息是指對類的成員函式的呼叫,不同的行為是指不同的實現,也就呼叫不同的函式。換言之,多型指的就是用同樣的介面訪問功能不同的函式,從而實現「乙個介面,多種方法」。
物件導向的多型性可以分為4類:過載多型,強制多型,包含多型,引數多型。前面兩種統稱專用多型,後面兩種統稱通用多型。
過載多型包括前面學過的普通函式及類的成員函式的過載還有運算子的過載。
普通函式過載舉例:
int add(int x, int y)
double add(double x, double y)
float add(float x, float y)
類的成員函式相當於函式在類的內部實現過載,在這兒就不詳細說明了,跟普通函式過載大同小異。
下面重點介紹運算符號過載:
運算子過載是對已有的運算子賦予多重含義,使同乙個運算子作用於不同型別的資料導致不同的行為。
運算子過載可以分為過載為成員函式以及過載為非成員函式兩種。
其一般語法形式為:返回型別 operator 運算子(形參表)例1:(單目運算子)實現複數類前置++,後置++運算子過載
#includeusing namespace std;
class complex
complex& operator ++() ;//前++
complex operator ++(int) ;//後++
void diaplaycomplex() const ;
private:
double real;
double image;
};int main()
執行結果:
這裡需要注意的是前置++,返回值時complex&
表示返回乙個可修改的左值,後置++返回的是乙個右值complex
,另外,前置++形參表()
,後置++形參表(int)
,只是對兩種運算作區分。
例2:(雙目運算子)過載運算子實現對複數的加法
#include"operator.h"
#include using namespace std;
class complex
complex operator +(const complex &c) const;
void diaplaycomplex() const;
private:
double real;
double image;
};complex complex::operator +(const complex &c)const ;
void complex::diaplaycomplex() const ;
int main()
執行結果:
一般語法形式:
返回型別 operator 運算子(形參表)
例1:對類point過載「++」(自增),"--"(自減)運算子,要求同時過載字首和字尾的形式,過載為非成員函式。
//對類point過載「++」(自增),"--"(自減)運算子,要求同時過載字首和字尾的形式
#include "pch.h"
#include using namespace std;
class point
void showpoint();
//以非成員函式型別實現
friend point& operator ++( point& p);
friend point operator ++(point& p, int);
private:
int x, y;
};void point::showpoint() ;
class dog :public mammal;
class cat :public mammal ;
void fun(mammal *m)
void mammal::speak() ;
void dog::speak() ;
void cat::speak() ;
int main()
執行結果:
這裡speak()
函式定義為virtual,然後通過
void fun(mammal *m)
實現多型,注意fun()
形式引數只能是基類物件指標或者引用。fun()
函式也可以這樣寫,用基類引用實現:
void fun(mammal &m)
純虛函式是乙個在基類中宣告的虛函式,它在該基類中沒有定義具體的操作內容,要求各派生類根據實際需要給出各自的定義。純虛函式的宣告格式為:
virtual 函式型別 函式名 (參數列)=0;
而抽象類就是指帶有純虛函式的類。
對上面的例子進行修改,用抽象類實現:
//編寫乙個哺乳動物類mammal,再由此派生出狗類dog,cat類,三者都宣告speak()成員函式,該函式在基類中被宣告為虛函式。
#include #includeusing namespace std;
class mammal ;
class dog :public mammal;
class cat :public mammal ;
void fun(mammal &m)
void dog::speak() ;
void cat::speak() ;
int main()
這裡需要注意的是抽象類不能進行例項化,如:
就會報錯:
採用函式模板,它可以用來建立乙個通用的函式,以支援多種不同形參,避免過載函式的函式體重複設計,通過給出不同的型別引數,使得乙個結構有多種型別。以實現引數多型。
定義的一般形式:
template 《模板參數列》
函式返回值型別 函式名(參數列)
舉例說明:下面是求絕對值得函式模板及其應用。
#include "pch.h"
#include using namespace std;
template t abs(t x)
int main()
執行結果:
多型性可以分為4類:過載多型,強制多型,包含多型,引數多型。
對於c++的多型性,這是一項很靈活的技術,用法十分靈巧。
簡單來說:多型性就是適當的使用介面函式,通過乙個介面來使用多種方法,(相當於上級說乙個命令,甲乙丙丁等人都做出反應,乙個命令,產生多個反應。
C 多型性總結
多型性是c 語言最重要的基本特徵之一 正是因為多型性的靈活,才使之如此重要,也需要仔細思考才能很好把握 多型 polymorphism 動態繫結使編譯器能夠在執行時決定使用基類中定義的函式還是派生類中定義的函式 虛函式的前提是有基類及其派生類 在基類中要有虛函式的定義 成員函式的virtual宣告....
C 多型性總結
c 物件導向程式中存在三種多型 1 物件型別的多型。派生類的物件的型別既可以是派生類,也可以是基類,即乙個物件可以屬於多種型別。2 物件標識的多型。基類的指標或引用可以指向或引用基類物件,也可以指向或引用派生類物件,即乙個物件標識可以屬於多種型別,它可以標識多種物件。在物件識別符號定義時指定的型別稱...
C 之多型性總結
起初接觸到這個名詞的時候,是在看 c 看到的,裡邊寫的概念還是比較好理解的。但是這次看到了 c 多型就是同一操作作用於不同物件,可以有不同的解釋,產生不同的執行結果。這就是多型性。同時要多型性是通過派生類覆寫基類中的虛函式型方法來實現的。說到這裡,就不得不說一下過載和覆寫。什麼是過載呢?就是乙個類中...