多型:一種呼叫語句有多種表現形態
錯誤示例
class parent
void
print()
private:
int a;};
class child: public parent
void
print()
private:
int b;};
intmain()
解決方案:用virtual關鍵字
注意:如果使用了virtual關鍵字,但是兩個類中的函式原型不一樣,也不會發生多型。
函式原型指的是函式的頭。
class parent
virtual void
print()
private:
int a;};
class child: public parent
virtual void
print()
private:
int b;};
intmain()
物件導向三大思想:封裝、繼承、多型
實現多型三個條件:
1 要有繼承
2 要有函式重寫virtual
3用父類指標或引用指向子類物件
虛析構函式
建構函式不能是虛函式,建立乙個派生類物件時,必須從類層次的根開始,
沿著繼承路徑逐個呼叫基類的建構函式
析構函式可以是虛的,虛析構函式用於指引delete運算子正確析構動態物件
class a~a
()private:
char
*p;}
; class b: public a~b
()private:
char
*p;}
;class c: public b~c
()private:
char
*p;}
;void
how_to_delete
(a *base)
intmain()
過載、重寫、重定義
過載必須在乙個類的內部;子類無法過載父類的函式,父類同名函式被覆蓋;
過載實在編譯期間根據引數型別和個數呼叫。
重寫發生字父類和子類的兩個類之間。
重寫分為兩類
1 虛函式重寫,使用virtual關鍵字,發生多型;多型是在執行期間根據物件具體的型別決定呼叫
2 非虛函式重寫 不使用virtual關鍵字(叫重定義)
class parent
public:
三個函式是過載的關係
virtual void
func()
virtual void
func
(int i)
virtual void
func
(int i,
int j)};
class child: public parent
virtual void
func
(int i,
int j,
int k)
public:
void
abc(
) 兩個類中的abc函式為重寫中的非虛函式重寫(重定義),覆蓋;但可用域作用符呼叫父類函式 };
intmain()
多型原理研究
多型成立的三個條件:1、繼承。2、虛函式重寫virtual。3、父類指標(或引用)指向子類物件。
class parent
virtual void
print()
private:
int a;};
class child : public parent
virtual void
print()
private:
int b;};
void
how_to_play
(parent *base)
intmain()
多型的實現原理
當類中宣告虛函式時,編譯器會在類中生成乙個虛函式表
虛函式表是乙個儲存類成員函式指標的資料結構
虛函式表由編譯器自動生成和維護
virtual成員函式會被編譯器放在虛函式表中
存在虛函式時,每個物件都有乙個直線跟虛函式表的指標(vptr指標)
加入virtual函式的類定義的物件,會多乙個vptr指標,其所佔記憶體比沒有
virtual的多4個位元組
物件在建立時,有編譯器對vptr指標進行初始化,只有當物件的建構函式完全結束時,vptr指標才最終確定
父類物件的vptr指標只能指向父類虛函式表,子類的只能指向子類虛函式表
class parent
virtual void
print()
}; class child: public parent
virtual void
print()
};intmain()
純虛函式和抽象類
純虛函式是在基類中說明的虛函式,在基類中沒有定義,要求任何派生類都定義自己的版本
純虛函式為派生類提供了乙個公共的介面
純虛函式說明形式:virtual 型別 函式名(參數列)=0
乙個具有純虛函式的基類為抽象類
#include
using namespace std;
class parent
;class circle: public parent
virtual void
get_area()
private:
int r;};
class tringle: public parent
virtual void
get_area()
private:
int a;
int h;};
void
play
(parent *base)
intmain()
C 多型 過載重寫和重定義
c 中物件導向3大概念 封裝 突破c函式的概念 用類做函式引數的時候,可以使用物件的屬性 和物件的方法 繼承 a b 復用 多型 可以使用未來 實現多型的三個條件 1 要有繼承 2 要有虛函式重寫 3 用父類指標 父類引用 指向子類物件 class parent virtual void print...
C 過載 重寫 重定義 多型
多型是基於對抽象方法的覆蓋來實現的,用統一的對外介面來完成不同的功能。過載也是用統一的對外介面來完成不同的功能。那麼兩者有什麼區別呢?也叫覆蓋,子類重新定義父類中有相同名稱相同引數的虛函式,主要是在繼承關係中出現的,被重寫的函式必須是virtual的,重寫函式的訪問修飾符可以不同,儘管virtual...
C 函式重定義 過載 重寫
c 的重寫,過載,重定義 1.重寫 override 又稱覆蓋 父類與子類之間的多型性。子類重新定義父類中有相同名稱和引數的虛函式。1 被重寫的函式不能是 static 的。必須是 virtual 的,或者是 override 的 即函式在最原始的基類中被宣告為 virtual c 中沒有 over...