1.公有继承,保护继承,私有继承,多重继承,多继承,虚继承
2. 什么是继承?父类(基类) 子类(派生类)
3.内存中的对象
4. 对于有继承基类的派生类,其构造函数先执行基类的构造函数,再执行派生类的构造函数,而析构函数恰恰相反
继承是概念上的继承关系,而不是个体的继承
5. 继承方式
公有继承:class A: public B B中所有的成员都可以被A继承,A可以调用数据成员和成员函数
保护继承:class A: protected B protected要是没有继承,那么跟private一样。protected是可以被继承
私有继承:class A: private B private的数据成员被继承到不可见位置。
/************************************公有继承******************************************************/
基类成员访问限定 public 派生类成员访问权限
private 不可访问
protected protected
public public
通过公有的继承方式,无法将私有的数据继承到派生类当中
/************************************保护继承******************************************************/
基类成员访问属性 继承方式 派生类成员访问属性
private protected 无法访问
protected protected
public protected
当进行保护继承的时候,基类中的数据成员和成员函数都无法直接访问
/************************************私有继承******************************************************/
基类成员访问属性 继承方式 派生类成员访问属性
private private 无法访问
protected private
public private
/*****************************************************************************************************/
6. 覆盖和隐藏
隐藏:父类和子类有同名的数据成员或者成员函数的时候,子类会隐藏父类的同名函数。可以通过特殊手段来访问数据成员或者成员函数
父子关系,成员同名,隐藏
若要调用的是父类同名函数则有
soldier.Person::play();
父类和子类中的同名函数无法形成重载,只能形成隐藏
7. isA
可以用子类初始化父类,基类的指针可以指向派生类
存储结构
1)子类初始化父类。将子类从父类继承下来的数据成员赋给父类,而其他成员则删除。若是用父类指针指向子类对象,那么该指针只能访问继承的数据成员
8. 虚析构函数
当存在继承关系,使用父类指针指向子类。也就是在堆中实例化一个父类对象,父类对象指针指向子类。这个时候delete父类的时候,子类并没有delete回造成内存泄露
添加关键字 virtual(可以被继承)即可
9. 函数传入的参数若是一个对象,会先实例化一个对象(临时变量),在函数调用完后被销毁。而输入的是指针或者是引用的时候,则没有这样的临时对象。
10. 继承与多重继承
一个派生类同时有多个基类:多继承 不写继承方式,默认为private
子类,父类,爷类:多重继承
11. 多继承+多重继承的烦恼
菱形继承(包含多继承与多重继承)D继承B,C,然后B和C继承A。按照这样子实例化D的话,会使得出现数据冗余(也就是要实例化两个A)
解决数据冗余:虚继承(virtual)
class A: virtual public B
{
}
12.解决重定义:宏定义
#ifndef PERSON_H
#define PERSON_H
#endif
13. 虚继承
只能从顶层父类获得默认的数据