前言:继承是为了精简程序
一、继承的基本语法
class 子类 :继承方式 父类
例如:class A :public B
A叫做子类或者派生类
B叫做父类或者基类
子类里的成员分为两种
一种是从父类中继承下来的,另外一种是自己新增的新成员
前者变现共性,后者表现个性
二、继承方式
>公共继承:父类中私有一直私有子类无法继承,其他权限父类如何继承后子类也是如何
>保护继承:父类中私有一直私有子类无法继承,其他权限都变成保护权限
>私有继承:父类中私有一直私有子类无法继承,其他权限都变成私有权限
class father{
public:
int a;
protected:
int b;
private:
int c;
};
class son1:public father{
public:
void func(){
m_a = 10;公共权限
m_b = 10;保护权限
m_c=10;//报错 父类私有权限无法访问
}
}
class son2:protected father{
public:
void func(){
m_a = 10;保护权限
m_b = 10;保护权限
m_c=10;//报错 父类私有权限无法访问
}
}
class son3:public father{
public:
void func(){
m_a = 10;私有权限
m_b = 10;私有权限
m_c=10;//报错 父类私有权限无法访问
}
}
三、继承中的对象模型
子类继承父类后,每加一个个性的成员
son(sizeof)= 所有成员(包括父类私有)的内存之和。
所以私有虽然访问不到但是也继承了!
四、继承中构造和析构的顺序
//继承中的构造和析构顺序
class Base{
public:
Base(){
count<<"Base的构造"<<endl;
}
~Base(){
count<<"Base的析构<<endl;
}
};
class Son :public Base{
public:
Son(){
count<<"Son的构造"<<endl;
}
~Son(){
count<<"Son的析构<<endl;
}
}
创建一个子类的对象
结果顺序如下
构造顺序:先有爸爸,后儿子
析构顺序:与构造相反
五、继承中同名成员处理方式
访问子类同名成员,直接访问即可
访问父类同名成员,需要加作用域
例如:s.m_A 没有作用域访问的是子类
s.Base(父类) :: m_A 访问的是Base(父类)下的成员m_A
六、继承同名静态成员处理方法
访问子类同名成员,直接访问即可
访问父类同名成员,需要加作用域
第一种同上 通过对象访问
第二章 通过类名访问
Son::Base::m_A;
第一个::通过类名的方式访问
第二个::代表父类作用于下
七、多继承语法
儿子认好几个爹
class 子类 :继承方式 父亲1 ,继承方式 父亲2....
多继承可能会导致父类同名成员需要作用域区分
!C++中不建议采用多继承
八、菱形继承
class 子类 :virtual public 父类 ();
应用题:
1.羊继承动物数据,骆驼继承动物数据,羊驼继承羊和驼的数据,
当羊驼使用数据时,就会产生二义性。
2.羊驼继承了两份动物数据,其实我们应该清楚这份数据一份就行
菱形继承,通过不继承数据,继承指针(虚继承指针)和偏移量找到目标数据