1静态联编和动态联编
1)静态多态 函数重载
2)动态多态 虚函数继承关系
2静态联编
1)地址早绑定 编译阶段绑定好地址
3动态联编
1)地址晚绑定,运行时候绑定好地址
4多态
1)父类的引用或指针指向子类的对象
2多态原理解析
1)当父类中有了虚函数后,内部结构就发生了改变,内部多了一个vfprt即virtual function pointer虚函数表指针
2)指向vtfable虚函数表
3)父类中结构体vtptr &Animal::speak
4)子类中 进行继承 会继承 vfptr vftable
5)构造函数中 会将虚函数表指针 指向自己的虚函数表
6)如果发生了重写,会替换掉虚函数表中的speak,改为&Cat::speak
7)深入剖析内部到底如何调用的((void()()) ((int*)(int)animal))();
3多态案例-计算器案例
1)早期方法 是不利于扩展的
2)开发有原则 开闭原则 对扩展开放 对修改关闭
3)利用多态实现–利于后期扩展,结构性非常好,可读性高,效率稍微低,内部结构复杂
4抽象类和纯虚函数
1纯虚函数写法 virtual void func() = 0;
2抽象类型
3抽象类 不可实例化对象
4如果类 继承了抽象类,必须重写抽象类中的纯虚函数
5虚析构
1 virtual ~类名(){}
2 解决问题:通过父类指针指向子类对象释放时候不干净导致的问题
6纯虚析构 类内声明,类外实现
写法virtual ~类名() = 0 .如果出现了纯虚析构函数,这个类也算抽象类,不可以实例化
class Animal
{
public:
virtual void speak()
{
cout << "动物在说话" << endl;
}
//普通析构 是不会调用子类的析构的,所以可能会导致释放不干净
//利用虚析构来解决这个问题
//virtual ~Animal()
//{
// cout << "Animal的析构调用" << endl;
//}
//纯虚析构,需要声明,还需要实现,类内声明,类外实现
virtual ~Animal() = 0;
};
Animal::~Animal()
{
cout << "Animal的纯虚析构调用" << endl;
}