目錄
虛函式 (virtual function) 指可以被子類繼承和覆蓋的函式.
基類宣告成員函式為虛函式的方法:
virtual [型別] 函式名([參數列列])
注: 在類外定義虛函式時, 不需再加 virtual.
虛函式的特點:
通過關聯 (binding), 我們可以把乙個識別符號和乙個儲存位址聯絡起來, 或者把乙個函式名與乙個類物件**在一起.
靜態關聯 (static binding) 指通過物件名呼叫虛函式. 在編譯時即可確定其呼叫的虛函式屬於哪一類
動態關聯 (dynamic binding) 是指通過基類指標與虛函式, 在執行階段確定關聯關係. 動態關聯提供動態的多型性, 即執行階段的多型性.
square 類:
#ifndef project6_square_h
#define project6_square_h
class square ;
int area() const
};#endif //project6_square_h
rectangle 類:
#ifndef project6_rectangle_h
#define project6_rectangle_h
#include "square.h"
class rectangle : public square;
int area() const
};#endif //project6_rectangle_h
main:
#include
#include "square.h"
#include "rectangle.h"
using namespace std;
int main()
輸出結果:
49 // 輸出的是底面積
此時呼叫的是 square 類的area()函式.
square 類:
#ifndef project6_square_h
#define project6_square_h
class square ;
virtual int area() const
};#endif //project6_square_h
rectangle 類:
#ifn程式設計客棧def project6_rectangle_h
#define project6_rectangle_h
#include "square.h"
class rectangle : public square;
int area() const
};#endif //project6_rectangle_h
main:
#include
#include "square.h"
#include "rectangle.h"
using namespace std;
int main()
輸出結果:
454 // 長方體的面積
此時呼叫的是 rectangle 類的area()函式.
animal 類:
#ifndef project6_animal_h
#define project6_animal_h
#include
using namespace std;
class animal
};#endif //project6_animal_h
dog 類:
#ifndef project6_dog_h
#define project6_dog_h
#include "animal.h"
class dog : public animal
};#endif //project6_dog_h
cat 類:
#ifndef project6_cat_h
#define project6_cat_h
#include "animal.h"
class cat : public animal
};#endif //project6_cat_h
pig 類:
#ifndef project6_pig_h
#define project6_pig_h
#include "animal.h"
class pig : public animal
};#endif //project6_pig_h
main:
#include
#include "animal.h"
#include "dog.h"
#include "cat.h"
#include "pig.h"
using namespace std;
int main()
輸出結果:
咋叫?汪汪!喵喵!
哼哼!虛函式只能是類的成員函式, 而不能將類外的普通函式宣告為虛函式. 虛函式的作用是允許在派生類中對基類的虛函式重新定義 (函式覆蓋), 只能用於類的繼承層次結構中.
虛函式能有效減少空間開銷. 當乙個類帶有虛函式時, 編譯系統會為該類構造乙個虛函式表 (乙個指標陣列), 用於存放每個虛函式的入口位址.
什麼時候應該使用虛函式:
有時候在定義虛函式的時候, 我們無需定義其函式體. 它的作用只是定義了乙個虛函式名, 具體的功能留給派生類去新增, 也就是純虛函式. 例如我們在上面的 animal 類的bark()函式就應該宣告為純虛函式, 因為 animal 為基類, 定義bark()函式實體並無意義.
本文標題: c/c++中虛函式詳解及其作用介紹
本文位址: /ruanjian/c/420718.html
C C 中組合詳解及其作用介紹
目錄 組合 composition 指在乙個類中另一類的物件作為資料成員.在平面上兩點連成一條直線,求直線的長度和直線中點的座標.要求 dot 類 ifndef project5 dot h define project5 dot h include using namespace std clas...
C C 中抽象類詳解及其作用介紹
目錄 抽象類 abstract class 是一些不用來定義物件程式設計客棧,而只作為基類被繼承的類.由於抽象類常用作基類,所以通常稱為抽象基類 abstract base class 定義抽象類的唯一目的,就是去建立派生類.我們在抽象類基礎上要定義出功能各異的派生類,再用這些派生類去建立物件.凡是...
C C 中字串流詳解及其作用介紹
目錄 檔案流類和字串流類都是 ostream,istream 和 iostream 類的派生類,因此對它們的操作方法是基本相同的.檔案流字串流 概念檔案流是以外存檔案為輸入輸出物件的資料流 字串流也 稱為記憶體流,以記憶體中使用者定義的字元陣列 字串 為輸入輸出的物件 相關流類 ifstream,o...