日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

C++中多态的概念和意义

發布時間:2025/4/5 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 析構函數能成為虛函數嗎

析構函數可以成為虛函數:

  • 建議在設計類時將析構函數聲明為虛函數(發生賦值兼容時,可以正確的調用析構函數,防止內存泄漏的發生)。
#include <iostream> #include <string>using namespace std;class Base { public:Base(){cout << "Base()" << endl;func();}virtual void func() {cout << "Base::func()" << endl;}virtual ~Base(){func();cout << "~Base()" << endl;} };class Derived : public Base { public:Derived(){cout << "Derived()" << endl;func();}virtual void func(){cout << "Derived::func()" << endl;}~Derived(){func();cout << "~Derived()" << endl;} };int main() {Base* p = new Derived();// ...delete p;return 0; }

輸出結果:


3 構造函數和析構函數中的多態

析構函數中是否可以發生多態?
析構函數中是否可以發生多態?

構造函數中不可能發生多態行為:

  • 在構造函數執行時,虛函數表指針未被正確初始化。

析構函數中不可能發生多態行為:

  • 在析構函數執行時,虛函數表指針已經被銷毀。

構造函數和析構函數中不能發生多態行為,只能調用當前類中定義的函數版本!

示例程序見2.2中的示例程序。


參考資料:

  • C++深度解析教程
  • 總結

    以上是生活随笔為你收集整理的C++中多态的概念和意义的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。