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

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)文章

  • opencv檢測(cè)直線方法之投影法

    opencv檢測(cè)直線方法之投影法

    這篇文章主要為大家詳細(xì)介紹了opencv檢測(cè)直線之投影法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++?數(shù)據(jù)結(jié)構(gòu)超詳細(xì)講解單鏈表

    C++?數(shù)據(jù)結(jié)構(gòu)超詳細(xì)講解單鏈表

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之單鏈表,鏈表是由一個(gè)個(gè)結(jié)點(diǎn)鏈結(jié)成的。結(jié)點(diǎn)包括數(shù)據(jù)域和指針域兩部分,數(shù)據(jù)域用來(lái)存儲(chǔ)數(shù)據(jù)元素的信息,指針域用來(lái)存儲(chǔ)下一個(gè)結(jié)點(diǎn)的地址,更詳細(xì)內(nèi)容請(qǐng)需要的小伙伴參考下面文章內(nèi)容
    2022-03-03
  • C++多線程之帶返回值的線程處理函數(shù)解讀

    C++多線程之帶返回值的線程處理函數(shù)解讀

    這篇文章主要介紹了C++多線程之帶返回值的線程處理函數(shù)解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語(yǔ)言單鏈表的實(shí)現(xiàn)

    C語(yǔ)言單鏈表的實(shí)現(xiàn)

    單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素。這篇文章主要介紹了C語(yǔ)言單鏈表的實(shí)現(xiàn) 的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • C++ 情懷游戲貪吃蛇的實(shí)現(xiàn)流程詳解

    C++ 情懷游戲貪吃蛇的實(shí)現(xiàn)流程詳解

    貪吃蛇是曾經(jīng)諾基亞手機(jī)上很經(jīng)典很經(jīng)典的傳統(tǒng)老游戲,80.90后的童年時(shí)不多的游戲之一,跟電腦上的掃雷一樣,下面來(lái)從貪吃蛇手機(jī)游戲的前世今生講起
    2021-11-11
  • C++?正則表達(dá)式的應(yīng)用詳解

    C++?正則表達(dá)式的應(yīng)用詳解

    正則表達(dá)式(regular?expression)描述了一種字符串匹配的模式(pattern),可以用來(lái)檢查一個(gè)串是否含有某種子串、將匹配的子串替換或者從某個(gè)串中取出符合某個(gè)條件的子串等
    2021-11-11
  • C++實(shí)現(xiàn)宿舍管理查詢(xún)系統(tǒng)

    C++實(shí)現(xiàn)宿舍管理查詢(xún)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)宿舍管理查詢(xún)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++讀寫(xiě)ini配置文件實(shí)現(xiàn)過(guò)程詳解

    C++讀寫(xiě)ini配置文件實(shí)現(xiàn)過(guò)程詳解

    這篇文章主要介紹了C++讀寫(xiě)ini配置文件實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 詳解C++程序中定義struct結(jié)構(gòu)體的方法

    詳解C++程序中定義struct結(jié)構(gòu)體的方法

    C++中同樣擁有C語(yǔ)言中的結(jié)構(gòu)體,下面就來(lái)詳解C++程序中定義struct結(jié)構(gòu)體的方法,需要的朋友可以參考下
    2016-05-05
  • C++模版函數(shù)詳解

    C++模版函數(shù)詳解

    C++中的模版總體可以分為兩大類(lèi):模版函數(shù)、模版類(lèi)。本篇文章先寫(xiě)模版函數(shù),需要的朋友可以參考下
    2017-02-02

最新評(píng)論