1、继承简介
动物
猫 狗
加菲猫,苹果猫, 啸天犬 , 狗头
网页的头
网页的尾
网页的左侧
都一样
只有网页的内容不一样的时候可以先写一个基类网页,让各个子类去继承
有效减少代码量
子类添加自己的内容,
使用时候直接子类创建对象,使用子类和基类的方法
语法:class 子类名:继承方式 基类
2、继承方式
子类能访问基类成员的权限 和 对继承下来的成员的权限变更
p128的截屏
protected 方式继承基类,的子类中类中可以访问protected的属性,但是子类构造出来的对象,就属于类外了,此对象就不能访问子类中的protected属性了,
3、继承中的对象模型
基类中所有非静态的成员都被子类继承去了,不管private,都继承下去了。
基类中的私有成员属性,被编译器隐藏了,访问不到
F:
跳转盘幅
跳转到具体路径: cl
查看命令:
cl /d1reportSingleClassLayout 文件名(那个.cpp文件)
4、子类父类中构造析构顺序
父子子父
先有父类再有子类
析构:因为在栈上所以:反向
创建子类对象,会先创建父类对象
5、父子成员属性同名时
创建的子类对象直接(点)操作的是子类的属性,
如果要访问父类的成员需要添加作用域运算符
Son s;
s.m_Age;//直接访问子类中的属性
s.Base::m_Age;//访问父类中的属性
当出现同名函数时候,也是一样的调用方式,直接点出来就是子类的函数,如果想要访问父类的方法,就加父类的作用域
如果子类中出现了和父类的同名函数,会隐藏父类中的所有同名函数,
加作用域就可以解隐藏
静态成员变量编译阶段分配内存,共享同一份数据,类内声明,类外初始化。
int Base::m_Age=10;
通过对象的方式访问静态成员,
通过类名的方式访问静态成员,
cout<<Son::Base::m_Age<<endl;
//通过类名(Son)的方式访问,访问Base作用域下的成员属性
//两个::表示的含义不一样
6、多继承语法
class Son : public Base1,public Base2
{
};
如果两个父类中有同名成员属性,如何区分?
加作用域运算符 ::
菱形继承:
问题:
继承了两份年龄数据,占用内存资源,
解决菱形继承的问题:使用虚继承
class sheep:virtual public animal
{};
class tuo:virtual public animal
{};
class sheeptuo:public sheep
{
};
解决菱形继承问题:虚基类表
把动物那个类变成虚基类,羊类和驼类继承一个虚基类指针,通过虚基类表,指向动物类的那个成员,保证唯一性