第48課.同名覆蓋引發的問題

1.父子間的賦值兼容(兼容性)

a.子類對象可以直接賦值給父類對象 b.子類對象可以直接初始化父類對象

c.父類指針可以直接指向子類對象 d.父類引用可以直接引用子類對象

       賦值                          指針(退化)
子類    ==>    父類            子類      ==>      父類
      初始化                         引用(退化)

當父類指針(引用)指向子類對象時 a.子類對象退化爲父類對象 b.只能訪問父類中定義的成員

eg:

#include <iostream>
#include <string>

using namespace std;

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

class Child : public Parent
{
public:
    int mv;
    
    void add (int x, int y, int z)
    {
        mv += (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);
    rp.add(10, 10);
    
    /*  無法通過編譯  */
    // pp->mv = 1000;
    // pp->add(1, 10, 100);

    return 0;
}

2.函數重寫

a.子類中可以重定義父類中已經存在的成員函數(同名函數) b.這種重定義發生在繼承中,叫做函數重寫 c.函數重寫是同名覆蓋的一種特殊情況

問題:如何解決父子類兼容時子類退化,不能使用子類中的成員?

問題分析:  a.編譯期間,編譯器只能根據指針的類型判斷所指的對象  b.根據賦值兼容,編譯器認爲父類指針指向的是父類對象  c.因此編譯結果只可能是調用父類中定義的同名函數

解決辦法:見49課多態

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章