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

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

 更新時間:2021年09月29日 09:59:35   作者:ryan-wei  
這篇文章主要介紹了C+繼承之同名覆蓋,函數(shù)重寫與多態(tài),是C++面向對象程序設計非常重要的概念,需要的朋友可以參考下,希望能夠給你帶來幫助

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

同名覆蓋

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

運行結果

base data: 1
derived data: 2
8

說明父類和子類是允許存在同名成員的,只不過父類的成員被編譯器隱藏了,正常訪問得到的是子類成員的值。

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

函數(shù)重寫

函數(shù)重寫是同名覆蓋的一種特殊情況,即子類中重新實現(xiàn)父類中的同名函數(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();//父類函數(shù)被隱藏
    d.print();
    return 0;
}

運行結果

Base class
Derived class

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

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

結果卻是都打印Base class

Base class
Base class

結果沒有符合預期,分析:

1.傳入父類對象b的地址時,父類指針指向父類對象,打印正常;

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

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

  • 父類對象,調(diào)用父類函數(shù)
  • 子類對象,調(diào)用重寫函數(shù)

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

多態(tài)

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

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

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

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

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

運行結果

Base class
Derived class

多態(tài)的意義:

在程序運行過程中展現(xiàn)出動態(tài)的特性函數(shù)重寫必須多態(tài)實現(xiàn),否則沒有意義多態(tài)是面向對象組件化程序設計的基礎特性

總結

同名覆蓋是繼承時發(fā)生在父類和子類之間,子類同名成員覆蓋(屏蔽)父類同名成員的現(xiàn)象;函數(shù)重寫也是同名覆蓋,函數(shù)重寫多態(tài)實現(xiàn)才有意義,C++通過virtual支持多態(tài)多態(tài)是面向對象組件化程序設計的基礎特性

相關文章

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

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

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

    VC++的combobox控件用法匯總

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

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

    因為之前的文章有說過C++中 set的介紹及用法,今天這篇文章我們就來說說C++為什么不能修改set里的值,如果非要修改的話應該怎么辦,下面我們一起進入文章看看下面內(nèi)容,需要的朋友可以參考以下,希望對你有所幫助
    2021-11-11
  • C語言實現(xiàn)靜態(tài)鏈表的方法

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

    分享一段代碼,一個靜態(tài)鏈表的C語言實現(xiàn),其中包含著一種簡單的內(nèi)存管理策略:固定大小的鏈式管理。
    2013-03-03
  • Clion下載安裝使用的詳細教程(Win+MinGW)

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

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

    C語言實現(xiàn)簡單登錄操作

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

    C語言關鍵字大全(共32個)

    這篇文章主要分享下C語言的32個關鍵字,需要的朋友可以參考下
    2013-07-07
  • C語言中的線程信號控制詳解

    C語言中的線程信號控制詳解

    這篇文章主要通過一些示例為大家詳細介紹一下C語言中的線程信號控制,文中的示例代碼講解詳細,對我們深入了解C語言有一定的幫助,感興趣的可以學習一下
    2023-02-02
  • 使用C語言解決字符串匹配問題的方法

    使用C語言解決字符串匹配問題的方法

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

    C語言簡明分析指針與引用的具體用法

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

最新評論

天台县| 兖州市| 中山市| 呼伦贝尔市| 巢湖市| 高阳县| 突泉县| 乃东县| 柳江县| 东辽县| 阳高县| 利津县| 萨迦县| 雷山县| 龙井市| 南涧| 元谋县| 平乡县| 三门峡市| 金秀| 年辖:市辖区| 漯河市| 澄江县| 政和县| 仲巴县| 密云县| 安徽省| 惠东县| 射洪县| 苗栗市| 大方县| 琼海市| 博乐市| 论坛| 宝山区| 潜山县| 淮安市| 安徽省| 永年县| 内丘县| 嵩明县|