深入剖析C++多态的实现与原理 | 您所在的位置:网站首页 › 编译时多态对应的实现机制 › 深入剖析C++多态的实现与原理 |
目录一、多态基础虚函数虚函数的继承虚类/虚基类重写/覆盖条件:概念:多态的条件其他的多态行为多态中子类可以不写virtual协变代码举例继承遗留问题解决析构函数具体解决方式:题目1答案:解析:题目2答案:C++11 override和finalfinal功能1:禁用继承使用场景:功能2:禁用重写使用场景override场景:描述:用法:重载、覆盖(重写)、隐藏(重定义)的对比纯虚函数概念:抽象类/纯虚类概念特点接口继承和实现继承二、多态原理引入(多态的原理)虚函数表指针虚函数表/虚表描述:虚表的特性(单继承)虚表的一般示例:对象中的虚表指针在构造函数中初始化虚表的位置谈谈对象切片谈谈多态的原理虚表打印例程1.VS查看虚表例程2.程序打印虚表源码:多继承虚表多继承下子类自己新增的虚函数在哪?多继承虚表打印代码结论与发现:this指针修正分析虚表中地址(概念修正)菱形继承+多态 与 菱形虚拟继承+多态菱形继承+多态菱形虚拟继承+多态(子类没有新增虚函数)菱形虚拟继承+多态(子类自己新增了虚函数)一些概念动态绑定和静态绑定内联函数inline 和 虚函数virtual静态函数static 与 虚函数构造函数、拷贝构造函数、赋值运算符重载 与 虚函数虚函数和普通函数谁快?
一、多态基础
虚函数
在函数前加上virtual就是虚函数 class A{ public: virtual void func(){}; //这是一个虚函数 }; 虚函数的继承虚函数的继承体现了接口继承 继承了接口等于继承了函数的壳,这个壳有返回值类型,函数名,参数列表,还包括了缺省参数 只需要重写/覆盖接口的实现(函数体) 虚类/虚基类含有虚函数的类是虚类. 是虚类,且是基类,则是虚基类 重写/覆盖 条件:三同:函数名,参数(平常说的参数都是说参数的类型,与缺省参数无关),返回值都要相同 概念:重写/覆盖是指该函数是虚函数且函数的名字、类型、返回值完全一样的情况下,子类的函数体会替换掉继承下来的父类虚函数的函数体 体现接口继承 重写/覆盖只有虚函数才有,非虚函数的是隐藏/重定义.注意区别 重写/覆盖只对函数体有效,返回值类型,函数名,参数列表,和缺省参数都不能修改 只要子类写上满足三同的虚函数都会触发重写.无论是否修改函数体 多态的条件多态有两个条件,任何一个不满足都不能执行多态 ,分别是 虚函数的重写多态的基础 class Person { public: virtual void BuyTicket() { //是虚函数 std::cout |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |