C++中多态的概念和意义
生活随笔
收集整理的這篇文章主要介紹了
C++中多态的概念和意义
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1 C++中多態的概念和意義
- 1.1 函數重寫回顧
- 1.2 多態的概念
- 1.3 多態的意義
- 1.4 靜態聯編和動態聯編
- 2 特殊的虛函數
- 2.1 構造函數能成為虛函數嗎
- 2.2 析構函數能成為虛函數嗎
- 3 構造函數和析構函數中的多態
1 C++中多態的概念和意義
1.1 函數重寫回顧
對于函數重寫:
- 父類被重寫的函數依然會繼承給子類。
- 子類中重寫的函數將覆蓋父類中的函數。
- 通過作用域分辨符(::)可以訪問到父類中的函數。
1.2 多態的概念
面向對象中期望的行為:
- 根據實際的對象類型判斷如何調用重寫函數。
- 父類指針(引用)指向:
- 父類對象則調用父類中定義的函數。
- 子類對象則調用子類中定義的重寫函數。
面向對象中多態的概念:
- 過呢據實際的對象類型決定函數調用的具體目標。
- 同樣的調用語句在實際運行時有多種不同的表現形態。
C++語言直接支持多態的概念:
- 通過virtua關鍵字對多態進行支持。
- 被virtual聲明的函數被重寫后具有多態特性。
- 被virtual聲明的函數叫做虛函數。
多態示例:
#include <iostream> #include <string>using namespace std;class Parent { public:virtual void print(){cout << "I'm Parent." << endl;} };class Child : public Parent { public:void print(){cout << "I'm Child." << endl;} };void how_to_print(Parent* p) {p->print(); // 展現多態的行為 }int main() {Parent p;Child c;how_to_print(&p); // Expected to print: I'm Parent.how_to_print(&c); // Expected to print: I'm Child.return 0; }1.3 多態的意義
多態的意義:
- 在程序運行過程中展現出動態的特性。
- 函數重寫必須多態實現,否則沒有意義。
- 多態是面向對象組件化程序設計的基礎特性。
1.4 靜態聯編和動態聯編
靜態聯編:
- 在程序的編譯期間就能確定具體的函數調用,如:函數重載。
動態聯編:
- 在程序實際運行后才能確定具體的函數調用,如:函數重寫。
動態聯編與靜態聯編:
#include <iostream> #include <string>using namespace std;class Parent { public:virtual void func(){cout << "void func()" << endl;}virtual void func(int i){cout << "void func(int i) : " << i << endl;}virtual void func(int i, int j){cout << "void func(int i, int j) : " << "(" << i << ", " << j << ")" << endl;} };class Child : public Parent { public:void func(int i, int j){cout << "void func(int i, int j) : " << i + j << endl;}void func(int i, int j, int k){cout << "void func(int i, int j, int k) : " << i + j + k << endl;} };void run(Parent* p) {p->func(1, 2); // 展現多態的特性// 動態聯編 }int main() {Parent p;p.func(); // 靜態聯編p.func(1); // 靜態聯編p.func(1, 2); // 靜態聯編cout << endl;Child c;c.func(1, 2); // 靜態聯編cout << endl;run(&p);run(&c);return 0; }2 特殊的虛函數
2.1 構造函數能成為虛函數嗎
構造函數不可能成為虛函數:
- 在構造函數結束后,虛函數表指針才會被正確的初始化。
2.2 析構函數能成為虛函數嗎
析構函數可以成為虛函數:
- 建議在設計類時將析構函數聲明為虛函數(發生賦值兼容時,可以正確的調用析構函數,防止內存泄漏的發生)。
輸出結果:
3 構造函數和析構函數中的多態
析構函數中是否可以發生多態?
析構函數中是否可以發生多態?
構造函數中不可能發生多態行為:
- 在構造函數執行時,虛函數表指針未被正確初始化。
析構函數中不可能發生多態行為:
- 在析構函數執行時,虛函數表指針已經被銷毀。
構造函數和析構函數中不能發生多態行為,只能調用當前類中定義的函數版本!
示例程序見2.2中的示例程序。
參考資料:
總結
以上是生活随笔為你收集整理的C++中多态的概念和意义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年券商排名出炉 净利润过百亿
- 下一篇: C++对象模型分析