天天看點

C++ 同名隐藏和指派相容規則

封裝,繼承,多态是面向對象的三大特性。每一種特性,都有很多細節知識點。在這裡,我們主要介紹一下繼承中的同名隐藏和指派相容規則。

同名隐藏:隻要子類中的函數名與父類函數名相同,子類中的函數将會隐藏所有父類和子類同名的函數,隻要名字相同就可以,不管參數清單。注意與函數重載的差別。

#include<iostream>
#include<stdio.h>
#include<string>

using namespace std;

class A
{
public:
    A() {}
    ~A() {}
    void setStr(string str)
    {
        cout<<"class A"<<endl;
    }
};

class B : public A
{
public:
    B() {}
    ~B() {}
    void setStr(char ch)
    {
        cout<<"class B:"<<"char"<<endl;
    }
    void setStr(double d)
    {
        cout<<"class B:"<<"double"<<endl;
    }
};

int main()
{
    B b;
    b.setStr('A'); // 1
    b.setStr(12.120); //2
    b.setStr("helloWorld"); //3

    b.A::setStr("helloWorld"); //4

    return 0;
}
           

在上述代碼中,标号1和2 的行 會按照函數重載的規則正确運作。 标号3則出錯。 因為 父類A中的函數被隐藏,在子類B中沒有可以處理string類型的相應函數。

如果想要使用父類A中的函數,則可以按照 标号4 的方式。

指派相容規則:

概念:在任何需要基類對象的地方都可以使用公有的派生類對象來替代。

在共有繼承方式下,指派相容規則規定:

(1)派生類對象可以指派給基類的對象,這個時候派生類的對象中,從對應基類中繼承來的隐藏部分指派給基類對象

(2)派生類對象的位址值可以指派給基類的對象指針,但隻能通過這個指針通路派生類中由基類繼承來的隐藏對象,不能通路派生類中的新成員

(3)派生類對象可以用來給基類對象引用初始化,但這個引用隻能包含派生類對象中由基類繼承來的隐藏對象

使用上述規則,必須注意兩點:

(1)必須是公有繼承

(2)上述條件不可逆

繼續閱讀