亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++多態(tài)的實(shí)現(xiàn)機(jī)制深入理解

 更新時(shí)間:2016年07月19日 11:23:44   作者:fk12138  
這篇文章主要介紹了C++多態(tài)的實(shí)現(xiàn)機(jī)制理解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

在面試過(guò)程中C++的多態(tài)實(shí)現(xiàn)機(jī)制經(jīng)常會(huì)被面試官問(wèn)道。大家清楚多態(tài)到底該如何實(shí)現(xiàn)嗎?下面小編抽空給大家介紹下多態(tài)的實(shí)現(xiàn)機(jī)制。

1. 用virtual關(guān)鍵字申明的函數(shù)叫做虛函數(shù),虛函數(shù)肯定是類(lèi)的成員函數(shù)。

2. 存在虛函數(shù)的類(lèi)都有一個(gè)一維的虛函數(shù)表叫做虛表。類(lèi)的對(duì)象有一個(gè)指向虛表開(kāi)始的虛指針。虛表是和類(lèi)對(duì)應(yīng)的,虛表指針是和對(duì)象對(duì)應(yīng)的。

3. 多態(tài)性是一個(gè)接口多種實(shí)現(xiàn),是面向?qū)ο蟮暮诵?。分為?lèi)的多態(tài)性和函數(shù)的多態(tài)性。

4. 多態(tài)用虛函數(shù)來(lái)實(shí)現(xiàn),結(jié)合動(dòng)態(tài)綁定。

5. 純虛函數(shù)是虛函數(shù)再加上= 0。

6. 抽象類(lèi)是指包括至少一個(gè)純虛函數(shù)的類(lèi)。

多態(tài)的簡(jiǎn)單介紹

一般來(lái)說(shuō),多態(tài)分為兩種,靜態(tài)多態(tài)動(dòng)態(tài)多態(tài)。靜態(tài)多態(tài)也稱(chēng)編譯時(shí)多態(tài),主要包括模板和重載。而動(dòng)態(tài)多態(tài)則是通過(guò)類(lèi)的繼承和虛函數(shù)來(lái)實(shí)現(xiàn),當(dāng)基類(lèi)和子類(lèi)擁有同名同參同返回的方法,且該方法聲明為虛方法,當(dāng)基類(lèi)對(duì)象,指針,引用指向的是派生類(lèi)的對(duì)象的時(shí)候,基類(lèi)對(duì)象,指針,引用在調(diào)用基類(lèi)的方法,實(shí)際上調(diào)用的是派生類(lèi)方法。這就是動(dòng)態(tài)多態(tài)。

靜態(tài)多態(tài)的實(shí)現(xiàn)

靜態(tài)多態(tài)靠編譯器來(lái)實(shí)現(xiàn),簡(jiǎn)單來(lái)說(shuō)就是編譯器對(duì)原來(lái)的函數(shù)名進(jìn)行修飾,在c語(yǔ)言中,函數(shù)無(wú)法重載,是因?yàn)椋琧編譯器在修飾函數(shù)時(shí),只是簡(jiǎn)單的在函數(shù)名前加上下劃線"_" 。而c++編譯器不同,它根據(jù)函數(shù)的類(lèi)型,個(gè)數(shù)來(lái)對(duì)函數(shù)名進(jìn)行修飾,這就使得函數(shù)可以重載,同理,模板也是可以實(shí)現(xiàn)的,針對(duì)不同類(lèi)型的實(shí)參來(lái)產(chǎn)生對(duì)應(yīng)的特化的函數(shù),通過(guò)增加修飾,使得不同的類(lèi)型參數(shù)的函數(shù)得以區(qū)分。

以下段程序?yàn)槔?br />

#include <iostream>
using namespace std;
template <typename T1, typename T2>
int fun(T1 t1, T2 t2){}
int foofun(){}
int foofun(int){}
int foofun(int , float){}
int foofun(int , float ,double){}
int main(int argc, char *argv[])
{
fun(1, 2);
fun(1, 1.1);
foofun();
foofun(1);
foofun(1, 1.1);
foofun(1, 1.1, 1.11);
return 0;
}

經(jīng)過(guò)編譯之后:

只選取main函數(shù)部分來(lái)看:

可以發(fā)現(xiàn),調(diào)用的函數(shù)名均發(fā)生了變化,都加了相應(yīng)的修飾,使得調(diào)用的函數(shù)是不一樣的,靜態(tài)多態(tài)就是如此。

動(dòng)態(tài)多態(tài)的實(shí)現(xiàn)

聲明一個(gè)類(lèi)時(shí),如果類(lèi)中有虛方法,則自動(dòng)在類(lèi)中增加一個(gè)虛函數(shù)指針,該指針指向的是一個(gè)虛函數(shù)表,虛函數(shù)表中存著每個(gè)虛函數(shù)真正對(duì)應(yīng)的函數(shù)地址。動(dòng)態(tài)多態(tài)采用一種延遲綁定技術(shù),普通的函數(shù)調(diào)用,在編譯期間就已經(jīng)確定了調(diào)用的函數(shù)的地址,所以無(wú)論怎樣調(diào)用,總是那個(gè)函數(shù),但是擁有虛函數(shù)的類(lèi),在調(diào)用虛函數(shù)時(shí),首先去查虛函數(shù)表,然后在確定調(diào)用的是哪一個(gè)函數(shù),所以,調(diào)用的函數(shù)是在運(yùn)行時(shí)才會(huì)確定的。

在聲明基類(lèi)對(duì)象時(shí),虛函數(shù)表中綁定的就是基類(lèi)的方法的地址。在聲明派生類(lèi)對(duì)象時(shí),虛函數(shù)表中綁定的就是派生類(lèi)的方法。在對(duì)象被創(chuàng)建之后(以指針為例),無(wú)論是基類(lèi)指針還是派生類(lèi)指針指向這個(gè)對(duì)象,虛函數(shù)表是不會(huì)改變的。
以下段程序?yàn)槔?br />

#include <iostream>
using namespace std;
class Base
{
public:
virtual void fun()
{
cout << "this is base fun" << endl;
}
};
class Derived : public Base
{
public:
void fun()
{
cout << "this is Derived fun" << endl;
}
};
int main(int argc, char *argv[])
{
Base b1;
Derived d1;
Base *pb = &d1;
Derived *pd = (Derived *)&b1;
b1.fun();
pd->fun();
d1.fun();
pb->fun();
return 0;
}

運(yùn)行結(jié)果如下:

從結(jié)果可以看出,當(dāng)一個(gè)對(duì)象被創(chuàng)建之后,在調(diào)用虛函數(shù)的時(shí)候,無(wú)論是派生類(lèi)指針還是基類(lèi)指針指向這個(gè)對(duì)象,調(diào)用虛函數(shù)的結(jié)果是一樣的。因?yàn)?,虛函?shù)表是不變。當(dāng)然,有可能在多繼承中會(huì)有多個(gè)虛函數(shù)表從而導(dǎo)致函數(shù)調(diào)用時(shí)調(diào)用不同的虛函數(shù)表,這里不做考慮。

以上所述是小編給大家介紹的C++多態(tài)的實(shí)現(xiàn)機(jī)制理解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • VsCode搭建C語(yǔ)言運(yùn)行環(huán)境詳細(xì)過(guò)程及終端亂碼問(wèn)題解決方案

    VsCode搭建C語(yǔ)言運(yùn)行環(huán)境詳細(xì)過(guò)程及終端亂碼問(wèn)題解決方案

    這篇文章主要介紹了VsCode搭建C語(yǔ)言運(yùn)行環(huán)境以及終端亂碼問(wèn)題解決,在VsCode中搭建C/C++運(yùn)行環(huán)境需要先安裝幾個(gè)插件,具體插件文中給大家詳細(xì)介紹,需要的朋友可以參考下
    2022-12-12
  • C++無(wú)鎖數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)示例詳解

    C++無(wú)鎖數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了C++無(wú)鎖數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • C++ pair的用法案例詳解

    C++ pair的用法案例詳解

    這篇文章主要介紹了C++ pair的用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C語(yǔ)言中讀寫(xiě)交替時(shí)出現(xiàn)的問(wèn)題分析

    C語(yǔ)言中讀寫(xiě)交替時(shí)出現(xiàn)的問(wèn)題分析

    讀寫(xiě)命令交替,一定要使用fseek重新定位,否則出現(xiàn)輸入顯示混亂,這篇文章主要介紹了C語(yǔ)言中讀寫(xiě)交替時(shí)出現(xiàn)的問(wèn)題分析,需要的朋友可以參考下
    2022-12-12
  • C++ 中const對(duì)象與const成員函數(shù)的實(shí)例詳解

    C++ 中const對(duì)象與const成員函數(shù)的實(shí)例詳解

    這篇文章主要介紹了C++ 中const對(duì)象與const成員函數(shù)的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能讓大家徹底掌握該如何使用,需要的朋友可以參考下
    2017-08-08
  • C語(yǔ)言之預(yù)處理命令的深入講解

    C語(yǔ)言之預(yù)處理命令的深入講解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言之預(yù)處理命令的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C++ opencv實(shí)現(xiàn)車(chē)道線識(shí)別

    C++ opencv實(shí)現(xiàn)車(chē)道線識(shí)別

    這篇文章主要為大家詳細(xì)介紹了C++ opencv實(shí)現(xiàn)車(chē)道線識(shí)別,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • C語(yǔ)言淺析函數(shù)的用法

    C語(yǔ)言淺析函數(shù)的用法

    C語(yǔ)言函數(shù)是用來(lái)模塊化構(gòu)建程序的。如果你的功能少,你可以全都寫(xiě)在mian函數(shù)中,但是當(dāng)實(shí)現(xiàn)功能多的時(shí)候,如果全寫(xiě)在main的函數(shù)里,不僅代碼不美觀,而且函數(shù)實(shí)現(xiàn)的時(shí)候結(jié)構(gòu)復(fù)雜,代碼重復(fù)
    2022-07-07
  • c++ 構(gòu)造函數(shù)的初始化列表

    c++ 構(gòu)造函數(shù)的初始化列表

    構(gòu)造函數(shù)的初始化列表僅僅指定用于初始化成員的值,并不指定這些初始化執(zhí)行的次序。成員初始化的次序就是定義成員的次序,第一個(gè)成員首先被初始化,然后是第二個(gè),依次類(lèi)推
    2013-07-07
  • C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹(shù)的實(shí)現(xiàn)方法

    C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹(shù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹(shù)的實(shí)現(xiàn)方法,簡(jiǎn)單說(shuō)明了哈夫曼樹(shù)的原理,并結(jié)合具體實(shí)例形式分析了C++實(shí)現(xiàn)哈夫曼樹(shù)的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11

最新評(píng)論