C++学习笔记20190705_多态

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;
}

小游戏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值