91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解C++多態的實現過程

發布時間:2021-11-24 13:08:30 來源:億速云 閱讀:167 作者:柒染 欄目:編程語言

如何理解C++多態的實現過程,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

多態描述的是使用基類的指針或引用操作多個類型的能力。

我們知道,子類的指針是可以隱式轉化為父類的,所以我們在進行程序設計的時候如果要對一個未知的類型進行處理,可以在方法聲明時把參數的類型聲明為父類的指針。

這要我們就是實現了根據傳入的類型執行不同的方法。這里的關鍵是子類在重寫父類的虛方法時是在虛方法表的相應位置對父類虛方法實現覆蓋。

舉個例子:

頭文件classFile.h:

#ifndef classFile_Header_File   #define classFile_Header_File   class father   {   public:       virtual void show();   };   class son: public father   {   public:       void show();       void sayhi();   };   #endif

這里我們在子類中對父類實現了override(C++沒有提供override關鍵字,所以改寫父類的方法要格外小心)。

TestPoly.cpp代碼如下:

#include<iostream>   #include"classFile.h"   using namespace std;   void hello(father* fp)   {           fp->show();   }   int main()   {       father f;       hello(&f);       son s;       hello(&f);   }   inline void father::show()   {       cout<<"I am father"<<endl;   }   inline void son::show()   {       cout<<"I am son"<<endl;   }   inline void son::sayhi()   {       cout<<"Hi, I am son"<<endl;   }

這里,傳入父類的指針將調用father::show(),傳入子類的指針時,雖然進行了隱式的類型轉化,但是由于子類在其繼承的虛方法表中相應的位置覆蓋了父類的show()方法,所用調用的實際上son::show()的內容。此時子類的方法表中不存在father::show()了,如果我們把virtual關鍵字去掉,那么father::show()和son::show()將同時存在與子類的方法表中。

那么如果子類做了父類沒用做的事情,我們應如何調用了?

比如這里,我們的子類中實現了sayhi()方法,這是父類指針father*無法獲取到的地址(實際是無法直接獲取到,通過手動的指針偏移還是可以的,不知道是C++的優點還是缺點),這個地方,如果我們能夠通過實際傳入的對象指針類型進行操作就OK了。還好C++為我們提過了這個功能,那就是引入關鍵字dynamic_cast。

我們把hello()函數改寫如下:

void hello(father* fp)   {       son* ps=dynamic_cast<son*>(fp);//將fp 轉換為son*類型       if(ps)//如果轉換失敗則返回0           ps->sayhi();       else           fp->show();   }

調用:

int main()   {       father f;       hello(&f);//轉換失敗,執行else       son s;       hello(&s); //輸出Hi,I am son   }

關于如何理解C++多態的實現過程問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

五家渠市| 阿克陶县| 泰州市| 三河市| 五台县| 南京市| 高邑县| 兴仁县| 福安市| 甘泉县| 邵东县| 临漳县| 武山县| 固镇县| 金昌市| 岳西县| 罗江县| 马公市| 晋中市| 咸宁市| 襄城县| 玛多县| 兰坪| 孟村| 平塘县| 普宁市| 郧西县| 蒲江县| 青岛市| 黑龙江省| 尖扎县| 射洪县| 双峰县| 青州市| 桦甸市| 农安县| 伊吾县| 凤阳县| 通州区| 桂林市| 镇巴县|