ToB企服应用市场:ToB评测及商务社交产业平台
标题:
深入剖析C++多态的实现与原理-详解
[打印本页]
作者:
曂沅仴駦
时间:
2024-6-9 20:50
标题:
深入剖析C++多态的实现与原理-详解
目录
多态基础
虚函数
虚函数的继续
虚类/虚基类
重写/覆盖
条件:
概念:
多态的条件
其他的多态行为
多态中子类可以不写virtual
协变
代码举例
继续遗留问题解决
析构函数
具体解决方式:
题目1
答案:
剖析:
题目2
答案:
C++11 override和final
final
功能1:禁用继续
使用场景:
功能2:禁用重写
使用场景
override
场景:
描述:
用法:
重载、覆盖(重写)、隐藏(重定义)的对比
纯虚函数
概念:
抽象类/纯虚类
概念
特点
接口继续和实现继续
多态原理
引入(多态的原理)
虚函数表指针
虚函数表/虚表
描述:
虚表的特性(单继续)
虚表的一样平常示例:
对象中的虚表指针在构造函数中初始化
虚表的位置
谈谈对象切片
谈谈多态的原理
虚表打印
例程1.VS查看虚表
例程2.步伐打印虚表
源码:
多继续虚表
多继续下子类自己新增的虚函数在哪?
多继续虚表打印代码
结论与发现:
this指针修正分析
虚表中地址(概念修正)
菱形继续+多态 与 菱形假造继续+多态
菱形继续+多态
菱形假造继续+多态(子类没有新增虚函数)
菱形假造继续+多态(子类自己新增了虚函数)
一些概念
动态绑定和静态绑定
内联函数inline 和 虚函数virtual
静态函数static 与 虚函数
构造函数、拷贝构造函数、赋值运算符重载 与 虚函数
虚函数和平凡函数谁快?
多态基础
虚函数
在函数前加上virtual就是虚函数
class A{
public:
virtual void func(){}; //这是一个虚函数
};
复制代码
虚函数的继续
虚函数的继续体现了接口继续
继续了接口等于继续了函数的壳,这个壳有返回值类型,函数名,参数列表,还包括了缺省参数
只需要重写/覆盖接口的实现(函数体)
虚类/虚基类
含有虚函数的类是虚类.
是虚类,且是基类,则是虚基类
重写/覆盖
条件:
三同:函数名,参数(寻常说的参数都是说参数的类型,与缺省参数无关),返回值都要相同
概念:
重写/覆盖是指该函数是虚函数且函数的名字、类型、返回值完全一样的环境下,子类的函数体会替换掉继续下来的父类虚函数的函数体
体现接口继续
重写/覆盖只有虚函数才有,非虚函数的是隐藏/重定义.注意区别
重写/覆盖只对函数体有效,返回值类型,函数名,参数列表,和缺省参数都不能修改
只要子类写上满足三同的虚函数都会触发重写.无论是否修改函数体
多态的条件
多态有两个条件,任何一个不满足都不能执行多态 ,分别是
虚函数的重写
多态的基础
[code] class Person { public: virtual void BuyTicket() { //是虚函数 std::cout
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4