覆蓋和多型的條件

2021-08-05 22:04:04 字數 2399 閱讀 1858

一.必須是成員函式

•只有類的成員函式才能被宣告為虛函式,全域性函式和類的靜態成員函式都不能被宣告為虛函式

–virtual

void global (void); // 錯誤

–class a

;

二.必須是虛函式

•只有基類中被virtual關鍵字宣告為虛函式的成員函式才能被子類覆蓋

–classa ;

–class

b : public

a ;

–class

c : public

b ;

–class

d : public

c ;

三.函式簽名必須相同

•虛函式在子類中的覆蓋版必須和該函式的基類版本擁有完全相同的簽名,即函式名、形參表和常屬性嚴格一致

–class a 

–class b : public a

;

四.返回同型別的基本型別或物件

•如果基類中的虛函式返回基本型別的資料或類型別的物件,那麼該函式在子類中的覆蓋版本必須返回相同型別的資料或物件,否則將引發編譯錯誤

–class a 

;–class b : public a

;

五.返回類的指標或引用允許協變

•如果基類中的虛函式返回類型別的指標或引用,那麼該函式在子類中的覆蓋版本可以返回其基類版本返回型別的公有子類的指標或引用——型別協變

–class x ;

–class y : public x ;

–class a

;–class b : public a

;

六.訪控屬性可以不同

•無論基類中的虛函式位於該類的公有、私有還是保護部分,該函式在子類中的覆蓋版本都可以出現在該類包括公有、私有和保護在內的任何部分

–class a 

;–class b : public a

;–a* a = new b;

a->foo (); // 呼叫b::foo,雖然其為私有成員

一.過載、覆蓋和隱藏

•過載必須在同乙個作用域中,包括通過using宣告引入的

•覆蓋要滿足一系列特殊條件

•子類與基類的同名成員函式,不滿足過載和覆蓋的條件,且能正常通過編譯,則必然構成隱藏

–class base 

;–class derived : public base

;

①和②構成過載

③和④構成過載

③隱藏②覆蓋①

④隱藏①覆蓋②出錯

一.指標和引用

•多型特性除了需要在基類中宣告虛函式以外,還必須借助指標或者引用呼叫該虛函式,才能表現出來

–rectangle r (...); 

circle c (...);

shape sr = r;

sr.draw (); // 呼叫shape::draw

shape sc = c;

sc.draw (); // 呼叫shape ::draw

二.this指標

•呼叫虛函式的指標也可能是成員函式中的this指標,只要它是乙個指向子類物件的基類指標,同樣可以產生多型

–class a 

; void bar (void)

};–class b : public a

; };

–b b;

b.bar ();

三.構造和析構函式

•當基類的建構函式被子類的構造函式呼叫時,子類物件尚不能說是子類型別的,它只表現出基類型別的外觀和行為。這時呼叫虛函式,它只能被繫結到基類版本

–class a 

virtual void foo (void) ;

};–class b : public a

; };

–b b;

•當基類的析構函式被子類的析構函式呼叫時,子類物件已不再是子類型別的了,它只表現出基類型別的外觀和行為。這時呼叫虛函式,它只能被繫結到基類版本

–class a 

virtual void foo (void) ;

};–class b : public a

; };

–b b;

•在基類的構造和析構函式中呼叫虛函式,絕不可能表現出多型性。實際被呼叫的一定是基類的原始版本,而非子類的覆蓋版本

•在構造或析構函式中通過已構造完畢或尚未析構的物件呼叫虛函式,其多型性不受任何影響

虛函式,覆蓋和多型

一.函式宣告中的virtual關鍵字 形如 class 類名 的成員函式,稱為虛函式或方法 class shape 一.在子類中覆蓋基類的虛函式 如果子類的成員函式和基類的虛函式具有相同的函式原型,那麼該成員函式就也是虛函式,無論其是否帶有virtual關鍵字,且對基類的虛函式構成覆蓋 class ...

多型與覆蓋

1.多型 運用多型時,引用型別可以是實際物件型別的父類 animal mydog new dog animal animals new animal 3 animals 0 new dog animals 1 new cat animals 2 new wolf for int i 0 i引數和返回...

過載 覆蓋 多型

過載與覆蓋 成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋是指派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與基類 2 函式名字相同 3 引數相同 4 基類函式必須有virtual 關鍵字。令人迷惑的隱藏規...