欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++?多態(tài)虛函數(shù)的底層原理深入理解

 更新時(shí)間:2022年08月05日 11:01:41   作者:煉丹之路???????  
這篇文章主要介紹了C++?多態(tài)虛函數(shù)的底層原理深入理解,多態(tài)是在不同繼承關(guān)系的類對(duì)象,去調(diào)用同一函數(shù),產(chǎn)生了不同的行為,通常是父類調(diào)用子類的重寫函數(shù),在C++中就是?父類指針指向子類對(duì)象,此時(shí)父類指針的向下引用就可以實(shí)現(xiàn)多態(tài)

多態(tài)的基本概念

1.1 什么是多態(tài)?

  • 多態(tài)是在不同繼承關(guān)系的類對(duì)象,去調(diào)用同一函數(shù),產(chǎn)生了不同的行為,通常是父類調(diào)用子類的重寫函數(shù),在C++中就是 父類指針指向子類對(duì)象,此時(shí)父類指針的向下引用就可以實(shí)現(xiàn)多態(tài)

比如看下面的代碼:

class Animal
{
public:
  //虛函數(shù)
  virtual void speak()
  {
    cout << "動(dòng)物在說話" << endl;
  }

  virtual void eat(int a )
  {
    cout << "動(dòng)物在吃飯" << endl;
  }
};

class Cat :public Animal
{
public:
  void speak()
  {
    cout << "小貓?jiān)谡f話" << endl;
  }

  void eat(int a)
  {
    cout << "小貓?jiān)诔燥? << endl;
  }
};
class Dog :public Animal
{
public:
  void speak()
  {
    cout << "小狗在說話" << endl;
  }
};

這兩個(gè)類實(shí)現(xiàn)集成關(guān)系,簡(jiǎn)單來說就是 Animal是父類,Cat是子類,通過父類引用調(diào)用子類函數(shù),這就是多態(tài)(字面意思就是一個(gè)對(duì)象多個(gè)狀態(tài)),這樣就 符合** 高內(nèi)聚低耦合** 的設(shè)計(jì)原則,更容易 后期維護(hù)與修改

1.2 怎么實(shí)現(xiàn)多態(tài)

說了這么多,那么多態(tài)到底怎么實(shí)現(xiàn)呢?

  • 想必上面代碼中也已經(jīng)透露出了一些信息,并且十分關(guān)鍵。沒錯(cuò),就是virtual,字面意思是 虛擬的,而也的確如此,這個(gè)關(guān)鍵字修飾的 函數(shù),叫做虛函數(shù),擁有虛函數(shù)的 類,被稱為 抽象類(虛類),virtual是實(shí)現(xiàn)多態(tài)的必要不充分條件
  • 同時(shí) ,子類要重寫父類的虛函數(shù),什么叫重寫?就是函數(shù)類型,函數(shù)名,參數(shù)列表完全相同。
  • 并且父類指針還要指向子類對(duì)象,

正如下所示:

void doSpeak(Animal & animal) //Animal & animal = cat;
{
  animal.speak();
}

void test01()
{
  Cat cat;
  doSpeak(cat);

  Dog dog;
  doSpeak(dog);
}

如此方能滿足實(shí)現(xiàn)多態(tài)的三個(gè)條件:

  • 注:如果沒有多態(tài),那么父類指向子類時(shí)就無法調(diào)用子類函數(shù),也就是此時(shí)該函數(shù)地址早就綁定好了,只能是animal說話,屬于靜態(tài)聯(lián)編(靜態(tài));如果想調(diào)用小貓說話,這個(gè)時(shí)候函數(shù)的地址就不能早就綁定好,而是在運(yùn)行階段再去綁定函數(shù)地址,屬于地址晚綁定,叫動(dòng)態(tài)聯(lián)編,(動(dòng)態(tài))多態(tài)的實(shí)現(xiàn)就是依靠動(dòng)態(tài)聯(lián)編。

2 虛函數(shù)的底層原理

那么虛函數(shù)到底是怎么工作的呢?

void test02()
{
  Animal * animal = new Cat;
  ((void(*)()) (*(int *)*(int *)animal)) ();
  typedef void( __stdcall *FUNPOINT)(int);
  (FUNPOINT (*((int*)*(int*)animal + 1)))(10);
}
  Animal * animal = new Cat;

就是animal->speak();

  ((void(*)()) (*(int *)*(int *)animal)) ();

這里 *(int *)animal 解引用到虛函數(shù)表中,先將animal類型的指針強(qiáng)轉(zhuǎn)為int *,然后解引用得到int類型的值放到虛函數(shù)表中,然后偏移相應(yīng)位置指向speak()

 ((void(*)()) (*(int *)*(int *)animal)) ();

調(diào)用貓說話,因?yàn)镃/C++默認(rèn)調(diào)用慣例 __cdecl,而用下列調(diào)用時(shí) 是__stdcall

typedef void( __stdcall *FUNPOINT)(int);
(FUNPOINT (*((int*)*(int*)animal + 1)))(10);

到此這篇關(guān)于C++ 多態(tài)虛函數(shù)的底層原理深入理解的文章就介紹到這了,更多相關(guān)C++ 多態(tài)虛函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++利用容器查找重復(fù)列功能實(shí)現(xiàn)

    C++利用容器查找重復(fù)列功能實(shí)現(xiàn)

    本文將詳細(xì)介紹c++容器簡(jiǎn)介,c++容器的比較 與操作實(shí)例,需要了解更多的朋友可以參考下
    2012-11-11
  • 關(guān)于C++出現(xiàn)Bus error問題的排查與解決

    關(guān)于C++出現(xiàn)Bus error問題的排查與解決

    項(xiàng)目代碼中經(jīng)常出現(xiàn)莫名其妙的Bus error問題,并且代碼中增加很多try catch 后依然不能將錯(cuò)誤捕獲,一旦Bus erro出現(xiàn),進(jìn)程直接崩潰掉,所以本文給大家介紹了關(guān)于C++出現(xiàn)Bus error問題的排查與解決,需要的朋友可以參考下
    2024-01-01
  • C++與Lua協(xié)程交互的示例詳解

    C++與Lua協(xié)程交互的示例詳解

    Lua 語言不支持真正的多線程,即不支持共享內(nèi)存的搶占式線程,在執(zhí)行協(xié)程體的 Lua 腳本時(shí),Lua 同樣可以調(diào)用 C++ 的函數(shù),本文給大家介紹了C++ 與 Lua 的協(xié)程交互,需要的朋友可以參考下
    2024-02-02
  • vs2019配置C++版OpenCV的方法步驟

    vs2019配置C++版OpenCV的方法步驟

    最近要用到很多OpenCV的庫(kù),所以開始學(xué)了點(diǎn)OpenCV,本文記錄VS和OpenCV的安裝、配置過程。具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-09-09
  • 一個(gè)win32窗口創(chuàng)建示例

    一個(gè)win32窗口創(chuàng)建示例

    這篇文章主要介紹了一個(gè)win32窗口創(chuàng)建示例,需要的朋友可以參考下
    2014-04-04
  • C++字符數(shù)組的輸入輸出和字符串結(jié)束標(biāo)志使用講解

    C++字符數(shù)組的輸入輸出和字符串結(jié)束標(biāo)志使用講解

    這篇文章主要介紹了C++字符數(shù)組的輸入輸出和符串結(jié)束標(biāo)志使用講解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • Libevent的使用及reactor模型詳解

    Libevent的使用及reactor模型詳解

    Libevent?是一個(gè)用C語言編寫的、輕量級(jí)的開源高性能事件通知庫(kù),主要有以下幾個(gè)亮點(diǎn):事件驅(qū)動(dòng)(?event-driven),高性能;輕量級(jí),專注于網(wǎng)絡(luò),這篇文章主要介紹了Libevent的使用及reactor模型,需要的朋友可以參考下
    2024-03-03
  • c++類和對(duì)象基本概念

    c++類和對(duì)象基本概念

    這篇文章主要為大家介紹了c++類和對(duì)象,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 使用C++ Matlab中的lp2lp函數(shù)教程詳解

    使用C++ Matlab中的lp2lp函數(shù)教程詳解

    本文介紹如何使用C++編寫數(shù)字濾波器設(shè)計(jì)算法,實(shí)現(xiàn)Matlab中的lp2lp函數(shù),將低通濾波器轉(zhuǎn)換為參數(shù)化的低通濾波器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-04-04
  • Windows上使用vs編譯fdk-aac的教程詳解

    Windows上使用vs編譯fdk-aac的教程詳解

    有時(shí)需要在Windows上用到fdk-aac,fdk-aac是源碼是cmake的,可以直接轉(zhuǎn)成vs項(xiàng)目,下面就跟隨小編一起學(xué)習(xí)一下如何在Windows上使用vs編譯fdk-aac吧
    2023-11-11

最新評(píng)論