类的继承中的同名隐藏规则和虚基类

作者在 2008-11-20 16:06:17 发布以下内容

虚基类是只有一个拷贝;

作用分辨符(::)的访问方式:基类::成员(参数)/成员

同名隐藏规则:没有虚函数的情况下,派生类中新增的与基类中的函数同名的函数,即使参数个数不同,则基类中的同名函数被覆盖;如果派生类中的多个基类拥有同名成员函数,派生类也新增了同名函数,则基类都被隐藏(这种情况,对派生类的访问用对象名。成员名对基类的用作用分辨符)。

<一>

#include<iostream>

using namespace std;
class B0
{public:
  int nV;
  void fun(){cout<<"B0"<<endl;}
 };
class B1:public B0
{public:
  int nV;
  void fun(){cout<<"B1"<<endl;}
};
class B2 :public B0
{public:
  int nV;
  void fun(){cout<<"B2"<<endl;}
};
class D1:public B1,public B2
{
public:
  int nV;
  void fun(){cout<<"D1"<<endl;}

};
int main()
{D1 d1;
 d1.nV=1;
 d1.fun();


 d1.B1::fun();
 d1.B2::fun();

 }

其运行结果为D1  B1  B2

<二>这里不能用d1。fun(),这样会产生二义性,必须通过作用分辨符(::)

#include<iostream>
using namespace std;
class B0
{public:
  int nV;
  void fun(){cout<<"B0"<<endl;}
 };
class B1:public B0
{public:
  int nV;
  void fun(){cout<<"B1"<<endl;}
};
class B2 :public B0
{public:
  int nV;
  void fun(){cout<<"B2"<<endl;}
};
class D1:public B1,public B2
{
};
int main()
{D1 d1;

 d1.B1::fun();
 d1.B2::fun();
 }

其结果为 :B1  B2

<三>如果B1,B2中没有和B0有同名函数,则其结果又不同了,变成了B0 B0

#include<iostream>
using namespace std;
class B0
{public:
  int nV;
  void fun(){cout<<"B0"<<endl;}
 };
class B1:public B0
{public:
  int nV1;
  void fun1(){cout<<"B1"<<endl;}
};
class B2 :public B0
{public:
  int nV2;
  void fun2(){cout<<"B2"<<endl;}
};
class D1:public B1,public B2
{
};
int main()
{D1 d1;

 d1.B1::fun();
 d1.B2::fun();
 }

其结果为B0 B0
<四>如果再<三>的基础上,再加虚基类,则就可以直接的用d1.fun()访问

如果在二的基础上是不行的

#include<iostream>
using namespace std;
class B0
{public:
  int nV;
  void fun(){cout<<"B0"<<endl;}
 };
class B1:virtual public B0
{public:
  int nV1;
  void fun1(){cout<<"B1"<<endl;}
};
class B2 :virtual public B0
{public:
  int nV2;
  void fun2(){cout<<"B2"<<endl;}
};
class D1:public B1,public B2
{
};
int main()
{D1 d1;
 d1.fun();
 }
其结果:B0




C++ | 阅读 2887 次
文章评论,共0条
游客请输入验证码
浏览77670次