隐藏规则

在没有虚函数的状况下,若是派生类中声明了与基类成员函数同名的新函数,即便函数的参数表不一样,从基类继承的同名函数的全部重载形式也都会被隐藏。若是要访问被隐藏的成员,就须要使用做用域分辨符基类名来限定。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的名称来限定,才可以唯一标识和访问成员。继承

相关文章
相关标签/搜索