C++ 多态与虚函数

本文介绍了C++的多态特性,重点讲解了虚函数的概念和作用,包括虚表的工作原理、虚函数的声明与实现、纯虚函数以及虚析构函数。通过理解这些概念,可以更好地掌握面向对象编程中的多态性。
摘要由CSDN通过智能技术生成

这一篇介绍一下 C++ 面向对象三大特征之一的多态(之前面试某大厂的实习生被问到多态,后来又了解到一些设计模式,才体会到多态的强大,在这里把对多态的一点点浅显认识总结一下)

如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢

多态

  • 父类的一个指针,可以有多种执行状态(父类的指针调用子类的函数),即多态
  • 多态实际上只是一种思想,而虚函数是实现这个思想的语法基础

虚函数

虚表

  • 若对象有虚函数,对象空间最开始 4Byte(32Bit目标平台)或 8Byte(64bit目标平台)内容是虚表(虚函数列表)的首地址,叫虚指针
  • 在实例化对象时,编译器检测到虚函数(virtual修饰的成员函数)时,会将虚函数的地址放到虚表(类似于一个存放函数指针的数组)中
  • 当实例化子类时,检测到有虚函数的重写,编译器会用子类重写的虚函数地址覆盖掉之前父类的虚函数地址,当调用虚函数时,检测到函数是虚函数就会从虚表中找对应的位置调用,若子类没有重写,虚表中的虚函数地址就还是父类的,若子类中有重写,虚表记录的就是子类重写的虚函数地址,即实现了父类的指针调用子类的函数
  • 虚表中先记录父类中的虚函数地址,接着记录子类中虚函数地址(若子类重写父类的虚函数则是覆盖)
  • 最后虚表还有一个尾值是 0
class Test {
   
public:
	virtual void vfunc() {
   
		cout << "Test virtual function" << endl;
	}
};

cout << sizeof(Test) << endl;
Test* p = new Test;
p->vfunc();
// 将类指针p强转为long long指针,访问前8Byte(long long*每次操作8Byte)获取到虚表指针,再将虚表指针转为long long指针,访问前8Byte获取到函数指针,将函数指针强转为void(*)()类型(类中的虚函数类型),即可调用函数
reinterpret_cast<void(*)()>(reinterpret_cast<long long*>(*reinterpret_cast<long long*>(p))[0])();
// 将上面的函数指针下移8Byte获得虚表的尾值0
cout << reinterpret_cast<long long*>(*reinterpret_cast<long long*>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值