隱藏規則

在沒有虛函數的狀況下,若是派生類中聲明瞭與基類成員函數同名的新函數,即便函數的參數表不一樣,從基類繼承的同名函數的全部重載形式也都會被隱藏。若是要訪問被隱藏的成員,就須要使用做用域分辨符基類名來限定。ios

在沒有虛函數的狀況下,若是某派生類的多個基類擁有同名的成員,同時,派生類又新增這樣的同名成員,在這種狀況下,派生類成員將隱藏全部基類的同名成員。函數

#include <iostream>

using namespace std;

class B1
{
public:
    int nV;
    void fun()
    {
        cout<<"Member of B1"<<endl;
    }
};
class B2
{
public:
    int nV;
    void fun()
    {
        cout<<"Member of B2"<<endl;
    }
};
class D1:public B1,public B2
{
public:
    int nV;
    void fun()
    {
        cout<<"Member of D1"<<endl;
    }
};
int main()
{
    D1 d1;
    d1.nV=1;
    d1.fun();

    d1.B1::nV=2;
    d1.B1::fun();

    d1.B2::nV=3;
    d1.B2::fun();
    return 0;
}

在主函數中,建立了一個派生類的對象d1,根據隱藏規則,若是經過成員名稱來訪問該類的成員,就只能訪問到派生類新增長的兩個成員,從基類繼承過來的成員因爲處於外層做用域而被隱藏。這時,要想訪問從基類繼承來的成員,就必須使用類名和做用域分辨符。程序中後面兩組語句就是分別訪問由基類B一、B2繼承來的成員,程序的運行結果爲:spa

若是某個派生類的部分或所有直接基類是從另外一個共同的基類派生而來,在這些直接基類中,從上一級基類繼承來的成員就擁有相同的名稱,所以派生類中也就會產生同名現象,對這種類型的同名成員也要使用做用域分辨符來唯一標識,並且必須用直接基類來進行限定。code

#include <iostream>

using namespace std;

class B0
{
public:
    int nV;
    void fun()
    {
        cout<<"Member of B0"<<endl;
    }
};
class B1:public B0
{
public:
    int nV1;
};
class B2:public B0
{
public:
    int nV2;
};
class D1:public B1,public B2
{
public:
    int nVd;
    void fun()
    {
        cout<<"Member of D1"<<endl;
    }
};
int main()
{
    D1 d1;
    d1.B1::nV=2;
    d1.B1::fun();

    d1.B2::nV=3;
    d1.B2::fun();
    return 0;
}


有一個基類B0,聲明瞭數據成員nV和函數fun,由B0公有派生產生了類B1和B2,再以B一、B2做爲基類共同公有派生產生了新類D1,在派生類中咱們再也不添加新的同名成員(若是有同名成員,一樣遵循隱藏規則),這時的D1類,就含有經過B一、B2繼承來的基類B0中的同名成員nV和fun。對象

間接基類B0的成員通過兩次派生以後,經過不一樣的派生路徑以相同的名字出現於派生類D1中,這時若是使用基類B0來限定,一樣沒法代表成員究竟是從B1仍是B2繼承過來,所以必須使用直接基類B1或者B2的名稱來限定,纔可以唯一標識和訪問成員。繼承

相關文章
相關標籤/搜索