多態的概念和意義


  • 函數重寫回顧
  1. 父類中被重寫的函數依然會繼承給子類
  2. 子類中重寫的函數將覆蓋父類中的函數
  3. 通過作用域分辨符(::)可以訪問父類中的函數
Chidl c;
Parent*p = &c;
c.Parent::print();  //在父類中繼承
c.print();          //在子類中重寫
p->print();         //父類中定義
  • 面向對象中期望的行為?
    根據實際的對象類型判斷如何調用重寫函數,父類指針(引用)指向父類對象則調用父類中定義的函數,如果指向子類對象則調用子類中定義的重寫函數。
  • 面向對象中多態的概念?
    根據實際的對象類型決定函數調用的具體目標,同樣的語句在實際運行時有多重不同的表現形態
  • C++語言支持多態的概念
  1. 通過使用virtual關鍵字對多態進行支持
  2. 被virtual聲明的函數被重寫后具有多態特性
  3. 被virtual聲明的函數叫做虛函數
  • 實驗
#include <iostream>
#include <string>
using namespace std;
class Parent
{
public:
    virtual void printf()
    {
        cout << "I'm Parent" << endl;
    }
};
class Child :public Parent
{
public:
    void printf()
    {
        cout << "I'm Child" << endl;
    }
};
void How_to_printf(Parent*p)
{
    p->printf();
}
int main()
{
    Child c;
    Parent p;
    How_to_printf(&c);
    How_to_printf(&p);  
}
  • 運行結果
I'm Child
I'm Parent
  • 多態的意義
  1. 在程序運行過程中展現出動態的特性
  2. 函數重寫必須多態實現,否則沒有意義
  3. 多態是面向對象組件化程序設計的基礎特性
  • 理論中的概念
  1. 靜態聯編:在程序的編譯期間就能確定具體的函數調用,如函數重載。
  2. 動態聯編:在程序實際運行后才能確定具體的函數調用,如函數重寫。
  • 小結
  1. 函數重寫只可能發生在父類和子類之間
  2. 根據實際對象的類型確定調用具體的函數
  3. virtual關鍵字是C++中支持多態的唯一方式
  4. 被重寫的虛函數可以表現出多態的特性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM