A->B
A>C
B,C->D
最远基类:没有父类(A)。
最近派生类:没有子类(D)。
问题:A被多次继承,在D中产生二义性。
解决方法:
1. 类的域名限定符。B::a。
2. 同名覆盖,最近派生类如果出现的成员名和基类出现的成员名相同就出现覆盖。
3. 虚继承。最远基类第一次被继承的过程中加 virtual。
虚继承的现象:
最远基类的构造函数由最近派生类驱使。引入虚指针
造成二义性:函数重载,默认参数,多次继承。
类型继承原则:
1. 基类指针可以指向派生类对象。
2. 派生类对象可以为基类对象赋值或初始化。
3. 派生类对象可以为基类所引用初始化。
动态联编和静态联编:
1. 静态联编:在程序编译时,确定了成员的类型。
2. 动态联编:在编译时,不确定成员的类型;而在程序运行时确定。在编译阶段,只提供函数表的入口地址。
动态联编->多态->虚函数->虚函数表
★ 虚函数表也可以打破封装。
多态:
1. 定义:相同的消息被不同的对象所接收,产生不同的行为。
虚函数调用的机制:
1. 基类的指针或者是基类的引用来调用虚函数。
虚析构函数:
防止内存泄露和多重free
抽象类:
1. 抽象类可以实现接口。主要功能是用来被继承。
2. 在类的声明里有至少一个纯虚函数。纯虚函数是抽象类的充分非必要条件。
3. 抽象类只能声明创建和引用。不能创建对象。
纯虚函数:
1. 声明方式:virtual 函数首部 = 0;