48_同名覆蓋引發(fā)的問題

1. 父子間的賦值兼容

子類對(duì)象可以當(dāng)作父類對(duì)象使用(兼容性)

  • 子類對(duì)象可以直接賦值給父類對(duì)象
  • 子類對(duì)象可以直接初始化父類對(duì)象
  • 父類指針可以直接指向子類對(duì)象
  • 父類引用可以直接引用子類對(duì)象

編程說明: 子類對(duì)象的兼容性問題

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    int mi;
    
    void add(int i)
    {
        mi += i;
    }
    
    void add(int x, int y)
    {
        mi += (x + y);
    }
};

class Child : public Parent
{
public:
    int mi;
    
    void add(int x, int y, int z)
    {
        mi += (x + y + z);
    }
};


int main()
{
    Parent p;
    Child c;
    
    p = c;
    Parent p1(c);
    
    Parent& rp = c;
    Parent* pp = &c;
    
    rp.mi = 100;
    rp.add(5);          //沒有發(fā)生同名?覆蓋
    rp.add(10, 10);     //沒有發(fā)生同名?覆蓋
    
    /* 為什么編譯不過 */
//  pp->mv = 100;
//  pp->add(1, 10, 100);
    
    return 0;
}
  • 當(dāng)使用父類指針(引用)指向子類對(duì)象時(shí):
    (1) 子類對(duì)象退化為父類對(duì)象
    (2) 只能訪問父類中定義的成員
    (3) 可以直接訪問被子類覆蓋的同名成員

2. 特殊的同名函數(shù)

子類中可以重定義父類中已經(jīng)存在的成員函數(shù),這種重定義發(fā)生在繼承中,叫做函數(shù)重寫。
函數(shù)重寫是同名覆蓋的一種特殊情況
編程說明:函數(shù)重寫初探

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    void print()
    {
        cout << "I'm Parent." << endl;
    }
};

class Child : public Parent
{
public:
    void print()    // 函數(shù)重寫
    {
        cout << "I'm Child." << endl;
    }
};

int main()
{
    Child c;
    
    c.print();

    return 0;
}

輸出結(jié)果:

I'm Child.

3. 思考:當(dāng)函數(shù)重寫遇上賦值兼容會(huì)發(fā)生什么?

  • 編程說明:賦值兼容的問題
#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    void print()
    {
        cout << "I'm Parent." << endl;
    }
};

class Child : public Parent
{
public:
    void print()    // override function
    {
        cout << "I'm Child." << endl;
    }
};

void how_to_print(Parent* p)
{
    p->print();
}

int main()
{
    Parent p;
    Child c;
    
    how_to_print(&p);   // Expected to print : I'm Parent.
    how_to_print(&c);   // Expected to print : I'm Child.

    return 0;
}

輸出結(jié)果:

I'm Parent.
I'm Parent.

問題分析:
(1) 編譯期間,編譯器只能根據(jù)指針的類型判斷所指向的對(duì)象;
(2) 根據(jù)賦值兼容,編譯器認(rèn)為父類指針指向的是父類對(duì)象;
(3) 因此,編譯結(jié)果只可能是調(diào)用父類中定義的同名函數(shù)

4. 問題:編譯器的處理方法是合理的嗎?是期望的嗎?

合理,但不是期望的。

5. 小結(jié)

  • 子類對(duì)象可以當(dāng)作父類對(duì)象使用(賦值兼容)
  • 父類指針可以正確的指向子類對(duì)象
  • 父類引用可以正確的代表子類對(duì)象
  • 子類中可以重寫父類中的成員函數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 結(jié)構(gòu)體和共同體的區(qū)別。 定義: 結(jié)構(gòu)體struct:把不同類型的數(shù)據(jù)組合成一個(gè)整體,自定義類型。共同體uni...
    breakfy閱讀 2,265評(píng)論 0 22
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,584評(píng)論 0 6
  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,872評(píng)論 33 466
  • 08六項(xiàng)日精進(jìn)打卡姓名:劉海北京多禾餐飲管理有限公司組別 249期謙虛1組【日精進(jìn)打卡第00105天】【知~學(xué)習(xí)】...
    七天樂餐閱讀 153評(píng)論 0 0
  • 這幾天接觸了兩種思維模式,一種是結(jié)構(gòu)式思維,一種是圖層式思維。 結(jié)構(gòu)式思維 大科學(xué)家牛燉告訴我的(據(jù)說牛頓發(fā)現(xiàn)萬有...
    好奇動(dòng)物閱讀 829評(píng)論 0 0

友情鏈接更多精彩內(nèi)容