第五周 继承
1.继承和派生的基本概念
2.继承关系和复合关系
3.覆盖和保护成员
4.派生类的构造函数
5.公有(public)继承的赋值兼容原则
3.覆盖和保护成员
派生类覆盖基类成员
派生类可以定义一个和基类成员同名的成员,这叫覆盖。在派生类中访问这类成员时,缺省的情况(不交代访问的是哪一个)是访问派生类中定义的成员。要在派生类中访问由基类定义的同名成员时,要使用作用域符号::。
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(); //基类的
}
derived obj;
obj.i = 1;
obj.base::i = 1;
注意:一般来说,基类和派生类不定义同名成员变量,但经常写同名成员函数。
类的保护成员
存取权限说明符:protected
基类的private成员:可以被下列函数访问
– 基类的成员函数
– 基类的友元函数
基类的public成员:可以被下列函数访问
– 基类的成员函数
– 基类的友元函数
– 派生类的成员函数
– 派生类的友元函数
– 其他的函数
基类的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 ,访问从基类继承的protected 成员
Son f;
f.nProtected = 1; //wrong ,f 不是当前对象
}
};
int main()
{
Father f;
Son s;
f.nPublic = 1; // Ok
s.nPublic = 1; // Ok
f.nProtected = 1; // error
f.nPrivate = 1; // error
s.nProtected = 1; //error
s.nPrivate = 1; // error
return 0;
}