1.覆盖
派生类可以定义一个和基类成员同名的成员,这叫做覆盖。在派生类中访问这样的的类成员时,缺省的情况是访问派生类中定义的成员。要在派生类中访问由基类定义的同名成员时,要使用作用域符::。
2.基类和派生类具有同名成员的情况。
class base
{
int j;
public:
int i;
void func();
};
class derived:public base
{
public:
int i;
void access();
void func();
};
void derived::access ()
{
j=5;//error
i=5;//引用的时派生类的i;
base::i=5;//引用的时基类的i
func();//派生类的
base::func();//基类的
}
int main()
{
derived obj
obj.i=1;
obj.base::i=1;
}
一般情况下,派生类定义和基类同名的变量是愚蠢的,但是定义同名的函数却可以存在。
如果定义了同名的变量,那么基类的变量会在派生类的变量的前边。
3.另一种存取权限说明符:protected
(1)基类的private成员:可以被以下函数访问
–基类的成员函数
–基类的友元函数
(2)基类的public成员:可以被以下函数访问
–基类的成员函数
–基类道德友元函数
–派生类的成员函数
–派生类的友元函数
–其他函数
(3)基类的protected成员:可以被以下函数访问
–基类的成员函数
–基类的与友元函数
–派生类的成员函数可以访问当前对象的基类的保护成员
举例子:
class father
{
private:int nprivate:
public:int npublic;
protected:int nprotected;
};
class son:public father
{
void accessfather(){
npublic=1; //ok
nprivate=1;//wrong
nprotected=1;//ok,访问从基类继承的protedted成员
son f;
f.nprotedted=1;//wrong,f不是当前对象
}
};
int main()
{
father f;
son s;
f.npublic=1;//ok
s.npublic=1;//ok
f.nprotedted=1;//error
f.nprivate=1;//error
s.nprotected=1;//error
s.nprivate=1;//error
return 0;
}