【C++】 47_父子間的衝突

思考:
子類中是否能夠定義父類中的同名成員?若是能夠,如何區分?若是不能夠,爲何?ios

#include <iostrem>

using namespace std;

class Parent
{
public:
    int mi;
};

class Child : public Parent
{
public:
    int mi;
};

int main()
{
    Child c;
    
    c.mi = 100;  // mi 到底是子類定義的,仍是從父類繼承獲得的?

    return 0;
}
輸出:
無錯誤,無警告

父子間的衝突

  • 子類能夠定義父類中的同名成員【位於不一樣做用域中】
  • 子類中的成員將隱藏父類中的同名成員
  • 父類中的同名成員依然存在於子類中
  • 經過做用域分邊符(::)訪問父類中的同名成員

  • 訪問父類中的同名成員
void code()
{
    Child c;
    
    c.mi = 100;           // 子類中的 mi
    c.Parent::mi = 1000;  // 父類中的 mi
}

編程實驗: 同名成員深度分析

#include <iostream>

using namespace std;

namespace A
{
    int g_i = 0;
};

namespace B
{
    int g_i = 1;
};

class Parent
{
public:
    int mi;
    
    Parent()
    {
        cout << "Parent()" << "&mi = " << &mi << endl;
    }
};

class Child : public Parent
{
public:
    int mi;
    
    Child()
    {
        cout << "Child()" << "&mi = " << &mi << endl;
    }
};

int main()
{
    Child c;
    
    c.mi = 100;
    c.Parent::mi = 1000;
    
    cout << "&c.mi = " << &c.mi << endl;
    cout << "c.mi = " << c.mi << endl;
    
    cout << "&c.Parent::mi = " << &c.Parent::mi << endl;
    cout << "c.Parent::mi = " << c.Parent::mi << endl;

    return 0;
}
輸出:
Parent() : &mi = 0xbf9797a8      ; 注意這裏 A
Child() : &mi = 0xbf9797ac       ; 注意這裏 B
&c.mi = 0xbf9797ac               ; 注意這裏 B
c.mi = 100
&c.Parent::mi = 0xbf9797a8       ; 注意這裏 A
c.Parent::mi = 1000

再論重載

  • 類中的成員函數能夠進行重載編程

    • 重載函數的本質爲多個不一樣函數
    • 函數名和參數列表是惟一的標識
    • 函數重載必須發生在同一個做用域中

問題:
子類中定義的函數是否可以重載父類中的同名函數?函數

編程實驗: 父子間的函數重載

#include <iostream>

using namespace std;

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

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

int main()
{
    Child c;
    
    c.mi = 100;
    c.Parent::mi = 1000;
    
    cout << "c.mi = " << c.mi << endl;
    cout << "c.Parent::mi = " << c.Parent::mi << endl;
    
    c.add(1);            // Error
    c.add(2, 3);         // Error
    c.add(4, 5, 6);
    
    cout << "c.mi = " << c.mi << endl;
    cout << "c.Parent::mi = " << c.Parent::mi << endl;

    return 0;
}
輸出:
test.cpp: In function ‘int main()’:
test.cpp:41: error: no matching function for call to ‘Child::add(int)’
test.cpp:25: note: candidates are: void Child::add(int, int, int)
test.cpp:42: error: no matching function for call to ‘Child::add(int, int)’
test.cpp:25: note: candidates are: void Child::add(int, int, int)

結論:
子類沒法重載父類中的成員函數

父子間的衝突

  • 子類中的函數將隱藏父類的同名函數
  • 子類沒法重載父類中的成員函數(不一樣做用域)
  • 使用做用域分辨符訪問父類中的同名函數
  • 子類能夠定義父類中徹底相同的成員函數

編程實驗: 同名函數深度分析

#include <iostream>

using namespace std;

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

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

int main()
{
    Child c;
    
    c.mi = 100;
    c.Parent::mi = 1000;
    
    cout << "c.mi = " << c.mi << endl;
    cout << "c.Parent::mi = " << c.Parent::mi << endl;
    
    c.Parent::add(1);
    c.add(2, 3);
    c.add(4, 5, 6);
    
    cout << "c.mi = " << c.mi << endl;
    cout << "c.Parent::mi = " << c.Parent::mi << endl;

    return 0;
}
輸出:
c.mi = 100
c.Parent::mi = 1000
c.mi = 120
c.Parent::mi = 1001

注意:【做用域】
c.Parent::add(1);            累加到 c.Parent::mi;
c.add(2, 3); c.add(4, 5, 6); 累加到 c.mi;

小結

  • 子類能夠定義父類中的同名成員
  • 子類中的成員將隱藏父類中的同名成員
  • 子類和父類中的函數不能構成重載關係【不一樣做用域】
  • 子類能夠定義父類中徹底相同的成員函數
  • 使用做用域分辨符訪問父類中的同名成員

以上內容參考狄泰軟件學院系列課程,請你們保護原創!spa

相關文章
相關標籤/搜索