又是一个C++很重要的概念
一、定义:
(一)、继承:在定义一个新的类B时,如果该类与某个已有的类相似(B有A所有的特点),那么可以把A作为一个基类,而B作为基类的一个派生类。
(1)派生类是通过对基类进行修改和扩充得到的。派生类中可以扩展新的成员变量和成员函数。
(2)派生类定义后,可以独立使用,不依赖于基类
(3)派生类拥有基类的全部成员函数和成员变量。(不管是private,public,protected)
(4)在派生类的各个成员函数中,不能访问基类的private成员
二、使用方式
class 派生类名 :public 基类名
{
.........;
};
注:派生类的体积等于基类的体积加上自己成员变量的体积,基类对象的存储位置位于派生类对象新增的成员变量前
三、继承关系与复合关系
(一)、继承:“是”关系
基类A,B是基类A的派生类
逻辑上要求:“一个B对象也是一个A对象”
(B对象包含A对象所有的特点)
(二)、复合:“有”关系:类A内有类B的的对象(封闭类)
逻辑要求:“B对象是A对象的固有属性或组成部分”
复合的一个小例子:狗和狗的主人
以上这个复合的使用是铁错的,循环定义是不允许的
四、派生类覆盖基类成员
派生类可以定义一个和基类成员同名的成员,这叫覆盖。在派生类中访问这类成员时,缺省的情况是访问派生类的成员,若访问基类定义的同名成员时,要用作用域符号::
注:一般基类和派生类不定义同名成员变量
五、类的保护成员:类比于private
protected可以让派生类的成员函数访问当前对象的基类保护成员
六、派生类的构造函数
与基类的构造函数由一些区别
class Father
{
private:
int i,j;
public:
Father(int i,int j):i(i),j(j)
{
};
};
class son : public Father
{
private:
int k;
public:
son(int i, int j, int k):Father(i,j),k(k)
{
};
};
1、在创建派生类的对象时,需要调用基类的构造函数:初始化派生类对象从基类继承的成员。在执行一个派生类的构造函数前,先执行基类的构造函数
2、调用基类构造函数的两种方式
显式:就是上面例子的形式
隐式:派生类的构造函数中,省略基类构造函数时,派生类的构造函数则自动调用基类的默认构造函数。
3、派生类中包含其他对象
class Father
{
private:
int i,j;
public:
Father(int i,int j):i(i),j(j)
{
};
};
class son : public Father
{
private:
int k;
example e1,e2; //example是一个类
public:
son(int i, int j, int k):Father(i,j),e1(***),e2(***),k(k)
{
};
};
创建派生类的对象:
1、先执行基类的构造函数
2、再执行封闭类的构造函数
3、再执行派生类自己的构造函数
消亡就反过来
七、public继承的赋值兼容规则:
(1)派生类的对象可以赋值给基类对象
(2)派生类对象可以初始化基类引用
(3)派生类对象的地址可以赋值给基类指针
注:派生方式若为private和protected以上不成立
1、protected继承时,基类的public和protected成员成为派生类的protected成员
2、private继承时。基类的public成员为private成员,基类的protected成员成为派生类的不可访问成员
这两种继承方式,逻辑上就不是“是”关系
八、直接基类传递与间接基类
1、派生类沿着类的层次自动向上继承它的间接基类
2、派生类的成员包括自己定义的成员,直接基类的成员,所有间接基类的所有成员
3、调用构造函数时,最先调用最初的基类的构造函数