物件導向的三大特徵:
相同物件收到不同訊息或不同物件收到相同訊息時產生的不同的動作。
#ifndef rect_h
#define rect_h
#include
#include
using namespace std;
class rect /矩形類
;#endif
// shape_h
如上面的**,他們函式名相同,引數個數不同,一看就是互為過載的兩個函式。
#include
"rect.h"
int main
程式在編譯階段根據引數個數確定呼叫哪個函式。這種情況叫做靜態多型(早繫結)。
比如計算面積 當給圓形計算面積時使用圓形面積的計算公式,給矩形計算面積時使用矩形面積的計算公式。也就是說有乙個計算面積的形狀基類,圓形和矩形類派生自形狀類,圓形與矩形的類各有自己的計算面積的方法。可見動態多型是以封裝和繼承為基礎的。
#ifndef shape_h
#define shape_h
#include
#include
using namespace std;
class shape//形狀類
;#endif
// shape_h
#include
"shape.h"
shape:
:shape()
double shape:
:calcarea()
上面基類的.h檔案和.cpp檔案,下面我們以此基類實現矩形類和圓形類。
#ifndef rect_h
#define rect_h
#include
"shape.h"
class rect:public shape //公有繼承自形狀類的矩形類
;#endif
// rect_h
#include
"rect.h"
rect:
:rect
(double width,
double height)
double rect:
:calcarea()
#ifndef circle_h
#define circle_h
#include
"shape.h"
class circle:public shape //公有繼承自形狀類的圓形類
;#endif
// circle_h
#include
"circle.h"
circle:
:circle
(double r)
double circle:
:calcarea()
intmain()
如果列印結果的話,以上程式結果會列印兩行"shape",因為呼叫到的都是父類的calcarea函式,並不是我們想要的那樣去分別呼叫各自的計算面積的函式。
如果要想實現動態多型則必須使用虛函式。
關鍵字 virtual 虛函式
用virtual去修飾成員函式使其成為虛函式。
所以以上函式的修改部分如下:
在shape.h,circle.h,rect.h將calcarea方法成為虛函式,在其前面加上關鍵字,例如:
virtual double
calcarea()
;
此時在去執行main函式輸出的結果應該為一行circle,一行rect。
此時便實現預期的結果了。
多型中存在的問題
2018.9.21 未完待續。。。。
c 深入理解虛函式
為什麼使用虛函式?什麼是虛函式?虛函式是為了解決什麼問題?物件導向的三大特徵 封裝繼承 多型 1.普通虛函式 2.虛析構函式 3.純虛函式 4.抽象類 5.介面類 6.隱藏 vs 覆蓋 7.隱藏與覆蓋之間的關係 8.早繫結和晚繫結 9.虛函式表 靜態多型 vs 動態多型 靜態多型也叫做早繫結 cla...
C 深入理解虛函式
c 深入理解虛函式 1 在基類用virtual宣告成員函式為虛函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便被呼叫。在類外定義虛函式時,不必在定義virtual 2 在派生類中重新定義此函式,要求函式名,函式型別,函式引數個數和型別全部與基類的虛函式相同,並根據派 生類的需要重...
深入理解虛函式
在c 中,在基類中被宣告為virtual並在在乙個或多個派生類中被重新定義的成員函式就是虛函式。基本格式如下 virtual return type func name arg 我們可以通過指向派生類的基類指標或引用來呼叫派生類中同名覆蓋的成員函式。如下 class a 究竟虛函式底層是如何實現多型...