继承
在定义一个新的类B时,如果该类与某个已有的类A相似(B拥有A的全部特点),就可以把A作为一个基类,而把B作为基类的一个派生类(子类)。
派生类
特点:
①基类进行修改和扩充,在派生类中,可以扩充新的成员变量的成员函数。
②派生类一经定义之后,可以独立使用,不依赖于基类。
③派生类拥有积累的全部成员函数和成员变量,不论是private、protected、public。
④派生类的各个成员函数中,不能访问基类的private成员。
写法:
class 派生类名 : public 基类名
{
};
例如:
//基类
class CStudent{
private:
int nAge;
public:
bool IsThreeGood() {};
void SetName(const string & name){
sName=name;
}
//......
};
//派生类
class UnderGraduateStudent:public CStudent{
private:
int nDepartment;
public:
bool IsThreeGood() {.......}; //覆盖
bool CanBaoYan() {.......};
};
//派生类2
class CGraduateStudent:public CStudent{
private:
int nDepartment;
char szMentorName[20];
public:
int CountSalary() {.......};
};
派生类对象的内存空间
派生类对象的体积,等于基类对象的体积加上派生类对象自己的成员变量的体积。
继承关系和复合关系
继承:“是”关系
复合:男人和女人复合出人;几何形体程序中:“点”类和“圆”类为复合关系:每一个“圆”对象里面都包含一个“点”对象,这个点对象就是圆心。
class CPoint
{
double x,y;
friend class CCircle; //把CCircle类变成友元,CCircle便于使用CPoint里的x,y(圆心)
};
class CCircle
{
double r;
CPoint center;
};
覆盖和保护成员
覆盖
这里强调一下:一般不要定义与基类变量相同的派生类变量。但可以定义与基类相同的函数成员(覆盖)。
保护成员 protected
基类的private成员:可以被下列函数访问
-基类的成员函数
-基类的友元函数
基类的public成员:可以被下列函数访问
-基类的成员函数
-基类的友元函数
-派生类的成员函数
-派生类的友元函数
-其他函数
-基类的protected成员:可以被下列函数访问
-基类的成员函数
-基类的友元函数
-派生类的成员函数可以访问当前对象的基类的保护成员
派生类的构造函数
在创建派生类的对象时,需要调用基类的构造函数:初始化派生类对象中基类继承的成员。在执行一个派生类的构造函数之前,总是先访问基类的构造函数。派生类的析构函数被执行时,执行完派生类的析构函数后,自动调用基类的析构函数。
public继承的赋值兼容规则
课件ppt来源于:MOOC 北京大学 郭炜老师