1.继承:单基继承
多基继承:先产生基类成员,在产生派生类成员 基类中含同名成员导致的二义性:处理办法是采用成员名限定
菱形继承: 将共同基类声明为虚基类
2.公有继承, 私有继承,保护继承: 基类私有成员都不能被派生类或派生类对象访问
public继承:派生类能访问基类的public protect,派生类对象只能访问基类的public -->基类的public private在派生类中保持不变
private继承:派生类能访问基类的public和protect成员,派生类对象不能访问基类任何成员 -->基类的public protected变成派生类的private
protected:派生类能访问public 和protected,派生类对象不能访问任何成员 -->基类的public protected在派生类中变为protected
3.类间的转换:
1.公有继承方式下,派生类的对象/指针/引用 可以赋值给基类(隐式转换),因为派生类中包含基类的信息
2.容许把基类对象指针/引用 强制转换为派生类对象指针/引用。
3.一个指向基类的指针可以用来指向该基类共有派生类的任何对象
4.转换构造函数:可以将构造函数声明为explicit,来禁止隐式转换
5.隐式转换:非c++内建型别A和B,在以下几种情况下B能隐式转换为A :
1.B公有继承自A
2.B中有类型转换函数class B{ operator A();}
3.实现了非explicit的参数为B,class A{ A(const B&) ;
6.静态联编和动态联编:在编译过程中进程联编叫静态联编,在运行时进行联编叫动态联编,
7.虚函数的访问:1.使用指针指向非虚函数时,编译器根据指针本身的类型决定调用哪个函数
2.使用指针指向虚函数时,编译器根据指针所指的对象的类型决定调用哪个函数
8.动态绑定条件:1.虚函数 2.基类指针或引用进行函数调用
9.构造函数和析构函数中的虚函数:如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本,编译器会解释为静态联编
10.虚函数表的实现: base b; 虚函数表地址 (int*)&b
虚函数表第一个虚函数地址 (int*)*(int*)( &b)
第二个 (int*)*(int*)(&b) + 1
调用虚函数 typedef void(*pfun)(void)
pfun fun = (pfun)*((int*)*(int*)&b +1)
11.单基继承时j仅有一个vptr,多基继承时有几个基类就有几个vptr
12.虚基类表指针,在虚拟继承的情况下,基类不管在继承串链中被派生多少次,永远只会存在一个实体
13.动态运行时类型识别(RTTI)和显式转换:
typeid 操作符,用于返回指针或者引用所指向对象的实际类型
强制类型转换:static_cast dynamic_cast const_cast reinterpret_cast
retinterpret_cast 类似于c的强制类型转换
const_cast 转换掉表达式的const 性质
static_cast 隐式执行类型转换
dynamic_cast dynamic_cast<type>(expression) type必须是类的指针,引用或者void*, 涉及运算时类型检查,而这个信息在虚函数表中,对没有虚函数表的类使用dynamic_cast会导致编译错误 -->把基类类型指针或引用转化为派生类的指针或引用
(检测当把基类指针(引用)转化为派生类的指针或引用时检测当前基类指针是否是指向一个派生类对象的)
14.