最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C+繼承之同名覆蓋,函數(shù)重寫(xiě)與多態(tài)詳解

 更新時(shí)間:2021年09月29日 09:59:35   作者:ryan-wei  
這篇文章主要介紹了C+繼承之同名覆蓋,函數(shù)重寫(xiě)與多態(tài),是C++面向?qū)ο蟪绦蛟O(shè)計(jì)非常重要的概念,需要的朋友可以參考下,希望能夠給你帶來(lái)幫助

如果父類(lèi)成員和子類(lèi)成員名字相同是否允許?會(huì)發(fā)生什么?

同名覆蓋

#include<iostream>
using namespace std;
class Base
{
public:
    int m_data;
    Base():m_data(1)//父類(lèi)初始化為1
    {  }
};
class Derived : public Base
{
public:
    int m_data;
    Derived():m_data(2)//子類(lèi)初始化為2
    {  }
};
int main()
{
    Derived d;
    //父類(lèi)的m_data被隱藏了,但仍存在,可以通過(guò)::符訪問(wèn)
    cout<<"base data: "<<d.Base::m_data<<endl;
    //直接訪問(wèn)m_data得到的是子類(lèi)成員的值
    cout<<"derived data: "<<d.m_data<<endl;
    //驗(yàn)證兩個(gè)int剛好是8字節(jié),說(shuō)明d對(duì)象有兩個(gè)整型數(shù)
    cout<<sizeof(d)<<endl;
    return 0;
}

運(yùn)行結(jié)果

base data: 1
derived data: 2
8

說(shuō)明父類(lèi)和子類(lèi)是允許存在同名成員的,只不過(guò)父類(lèi)的成員被編譯器隱藏了,正常訪問(wèn)得到的是子類(lèi)成員的值。

那么如果是函數(shù)同名呢?

函數(shù)重寫(xiě)

函數(shù)重寫(xiě)是同名覆蓋的一種特殊情況,即子類(lèi)中重新實(shí)現(xiàn)父類(lèi)中的同名函數(shù),屬于同名覆蓋

#include<iostream>
using namespace std;
class Base
{
public:
    void print()
    {
        cout<<"Base class"<<endl;
    }
};
class Derived : public Base
{
public:
    void print()
    {
        cout<<"Derived class"<<endl;
    }
};
int main()
{
    Derived d;
    d.Base::print();//父類(lèi)函數(shù)被隱藏
    d.print();
    return 0;
}

運(yùn)行結(jié)果

Base class
Derived class

如果調(diào)用how_to_print函數(shù),期望傳入父類(lèi)對(duì)象時(shí)調(diào)用父類(lèi)打印函數(shù),傳入子類(lèi)對(duì)象時(shí)調(diào)用子類(lèi)對(duì)象函數(shù)

void how_to_print(Base* p)
{
    p->print();//期望根據(jù)對(duì)象選擇相應(yīng)函數(shù),不能實(shí)現(xiàn)
}
int main()
{
    Base b;
    Derived d;
    how_to_print(&b);
    how_to_print(&d);
    return 0;
}

結(jié)果卻是都打印Base class

Base class
Base class

結(jié)果沒(méi)有符合預(yù)期,分析:

1.傳入父類(lèi)對(duì)象b的地址時(shí),父類(lèi)指針指向父類(lèi)對(duì)象,打印正常;

2.傳入子類(lèi)對(duì)象d的地址時(shí),父類(lèi)指針指向子類(lèi)對(duì)象,此時(shí)由于賦值兼容性(子類(lèi)對(duì)象可以當(dāng)作父類(lèi)對(duì)象使用),子類(lèi)對(duì)象退化為父類(lèi)對(duì)象(父類(lèi)指針只能訪問(wèn)父類(lèi)成員),編譯器認(rèn)為父類(lèi)指針指向的是父類(lèi)對(duì)象,因此最終調(diào)用了父類(lèi)的打印函數(shù)

以上結(jié)果是合理的,卻沒(méi)有符合預(yù)期的目的,這也是函數(shù)重寫(xiě)帶來(lái)的問(wèn)題。如果不能實(shí)現(xiàn)以上目的,函數(shù)重寫(xiě)是沒(méi)有意義的,那么如何實(shí)現(xiàn)父類(lèi)指針(引用)指向:

  • 父類(lèi)對(duì)象,調(diào)用父類(lèi)函數(shù)
  • 子類(lèi)對(duì)象,調(diào)用重寫(xiě)函數(shù)

實(shí)際上以上行為就是多態(tài)

多態(tài)

所謂多態(tài),即同樣的調(diào)用語(yǔ)句,在實(shí)際運(yùn)行時(shí)存在不同的表現(xiàn)狀態(tài),依據(jù)則是對(duì)象的類(lèi)型不同

要實(shí)現(xiàn)上文中函數(shù)重寫(xiě)的多態(tài),需要引入virtual關(guān)鍵字,C++原生支持多態(tài)

  • 通過(guò)使用virtual關(guān)鍵字對(duì)多態(tài)進(jìn)行支持
  • 被virtual聲明的函數(shù)被重寫(xiě)后具有多態(tài)特性
  • 被virtual聲明的函數(shù)叫做虛函數(shù)

在父類(lèi)函數(shù)print聲明前添加virtual關(guān)鍵字,print函數(shù)成為虛函數(shù),子類(lèi)重寫(xiě)的函數(shù)也將自動(dòng)變成虛函數(shù),這樣就可以實(shí)現(xiàn)多態(tài)

class Base
{
public:
    virtual void print()//加virtual變成了虛函數(shù)
    {
        cout<<"Base class"<<endl;
    }
};

運(yùn)行結(jié)果

Base class
Derived class

多態(tài)的意義:

在程序運(yùn)行過(guò)程中展現(xiàn)出動(dòng)態(tài)的特性函數(shù)重寫(xiě)必須多態(tài)實(shí)現(xiàn),否則沒(méi)有意義多態(tài)是面向?qū)ο蠼M件化程序設(shè)計(jì)的基礎(chǔ)特性

總結(jié)

同名覆蓋是繼承時(shí)發(fā)生在父類(lèi)和子類(lèi)之間,子類(lèi)同名成員覆蓋(屏蔽)父類(lèi)同名成員的現(xiàn)象;函數(shù)重寫(xiě)也是同名覆蓋,函數(shù)重寫(xiě)多態(tài)實(shí)現(xiàn)才有意義,C++通過(guò)virtual支持多態(tài)多態(tài)是面向?qū)ο蠼M件化程序設(shè)計(jì)的基礎(chǔ)特性

相關(guān)文章

  • C語(yǔ)言動(dòng)態(tài)內(nèi)存函數(shù)(malloc、calloc、realloc、free)詳解

    C語(yǔ)言動(dòng)態(tài)內(nèi)存函數(shù)(malloc、calloc、realloc、free)詳解

    在C語(yǔ)言中,動(dòng)態(tài)內(nèi)存函數(shù)是塊重要的知識(shí)點(diǎn),以往,我們開(kāi)辟空間都是固定得,數(shù)組編譯結(jié)束后就不能繼續(xù)給它開(kāi)辟空間了,開(kāi)辟的空間滿(mǎn)了,就不能在開(kāi)辟空間了,學(xué)習(xí)本文章,我們就可以解決這個(gè)問(wèn)題,向內(nèi)存申請(qǐng)空間,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2023-08-08
  • VC++的combobox控件用法匯總

    VC++的combobox控件用法匯總

    這篇文章主要介紹了VC++的combobox控件用法,對(duì)VC++初學(xué)者來(lái)說(shuō)尤為重要,需要的朋友可以參考下
    2014-08-08
  • C++為什么不能修改set里的值?非要修改怎么辦?

    C++為什么不能修改set里的值?非要修改怎么辦?

    因?yàn)橹暗奈恼掠姓f(shuō)過(guò)C++中 set的介紹及用法,今天這篇文章我們就來(lái)說(shuō)說(shuō)C++為什么不能修改set里的值,如果非要修改的話應(yīng)該怎么辦,下面我們一起進(jìn)入文章看看下面內(nèi)容,需要的朋友可以參考以下,希望對(duì)你有所幫助
    2021-11-11
  • C語(yǔ)言實(shí)現(xiàn)靜態(tài)鏈表的方法

    C語(yǔ)言實(shí)現(xiàn)靜態(tài)鏈表的方法

    分享一段代碼,一個(gè)靜態(tài)鏈表的C語(yǔ)言實(shí)現(xiàn),其中包含著一種簡(jiǎn)單的內(nèi)存管理策略:固定大小的鏈?zhǔn)焦芾怼?/div> 2013-03-03
  • Clion下載安裝使用的詳細(xì)教程(Win+MinGW)

    Clion下載安裝使用的詳細(xì)教程(Win+MinGW)

    這篇文章主要介紹了Clion下載安裝使用教程(Win+MinGW),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單登錄操作

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單登錄操作

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單登錄操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語(yǔ)言關(guān)鍵字大全(共32個(gè))

    C語(yǔ)言關(guān)鍵字大全(共32個(gè))

    這篇文章主要分享下C語(yǔ)言的32個(gè)關(guān)鍵字,需要的朋友可以參考下
    2013-07-07
  • C語(yǔ)言中的線程信號(hào)控制詳解

    C語(yǔ)言中的線程信號(hào)控制詳解

    這篇文章主要通過(guò)一些示例為大家詳細(xì)介紹一下C語(yǔ)言中的線程信號(hào)控制,文中的示例代碼講解詳細(xì),對(duì)我們深入了解C語(yǔ)言有一定的幫助,感興趣的可以學(xué)習(xí)一下
    2023-02-02
  • 使用C語(yǔ)言解決字符串匹配問(wèn)題的方法

    使用C語(yǔ)言解決字符串匹配問(wèn)題的方法

    這篇文章主要介紹了使用C語(yǔ)言解決字符串匹配問(wèn)題的方法,包括一道實(shí)例練習(xí)題,需要的朋友可以參考下
    2015-08-08
  • C語(yǔ)言簡(jiǎn)明分析指針與引用的具體用法

    C語(yǔ)言簡(jiǎn)明分析指針與引用的具體用法

    指針是一個(gè)實(shí)體,引用是一個(gè)別名;在匯編上,引用的底層是以指針的方式實(shí)現(xiàn)的,定義一個(gè)引用變量,相當(dāng)于定義了一個(gè)指針,然后把引用內(nèi)存的地址寫(xiě)到這個(gè)指針里面,當(dāng)通過(guò)引用變量修改它所引用的內(nèi)存時(shí),它先訪問(wèn)了指針里面的地址,然后在這個(gè)地址的內(nèi)存里面對(duì)值進(jìn)行修改
    2022-05-05

最新評(píng)論

略阳县| 商水县| 石楼县| 金堂县| 盐亭县| 小金县| 泸定县| 伊春市| 富民县| 建昌县| 德保县| 遵化市| 中方县| 仙游县| 从江县| 昌平区| 长丰县| 民县| 迭部县| 抚远县| 鄄城县| 新安县| 新宁县| 张家界市| 台湾省| 库车县| 称多县| 沧源| 阿拉尔市| 顺平县| 赞皇县| 保定市| 于田县| 岚皋县| 讷河市| 景泰县| 高淳县| 利津县| 衡阳市| 砀山县| 达拉特旗|