父子类成员共享
普通成员对象/父子间不共享, 成员独立
函数成员共享(函数不存储在对象中)
子类由两部分构成:父类中继承的成员和子类中新定义成员
继承方式
子类中存在父类private成员但不可直接访问(及时在类中),只能通过从父类继承的函数访问
子类不能访问父类私有成员,但可以通过父类成员函数直接使用,
派生类定义时,不写继承方式,派生类是struct默认public,是class则私有
实践中继承方式几乎都是公有继承
赋值兼容转换
指针只指向子类中的父类部分
引用只引用子类中父类部分
类似于截断
但不可以提升
普通截断实质就是类型转换
类型转换会产生临时变量
int i;
char& ch=i//权限放大
但赋值兼容转换不产生临时变量
与内置类型不一样
继承中的作用域
已知的域
父类子类同名成员
可以同时存在
子类会隐藏父类同名成员(也叫做重定义)
同一域不能有同名变量,但父类子类成员成员不在同一域
选b 隐藏=重定义
函数重载,前提在同一作用域
派生类的默认函数
派生类默认构造:
父类成员:调用父类构造
子类内置:初始化为0或不处理(取决编译器)
子类自定义类型:调用构造
默认拷贝构造:
父类成员:调用父类拷贝构造
子类内置:直接拷贝
子类自定义:调用拷贝
其他默认函数也同样,对父类成员的操作通过复用父类函数完成
自定义析构不显式调用父类析构
自定义析构不显式调用父类析构:子类析构结束后会自动调用父类析构,且不能显示调用析构(为了保证父子的析构顺序)
因为派生类与父类析构函数会构成隐藏关系(析构函数名称都会被处理成destructer,同名)
除析构外其他函数都要显式调用父对应函数
构造顺序:编译器固定先基类中的成员,后派生类新增成员,与成员初始化列表无关
所以构造时,可以子用父(的成员来初始化),不能父用子
派生类初始化列表不能显式初始化基类成员,只能通过父类构造
默认构造只能调派生类的无参构造