C++中的多态通过虚函数表实现,需要在运行时,根据指针所指对象的实际类型,根据对象中的虚函数表指针来索引相应的虚函数来调用。

对于class Derived : public Base1, public Base2

Base2 *pbase2 = new Derived

pbase2会调整this指针,使pbase2 指向 base2 subobject; 基类指针指向派生类时,实际都会调整,指向派生类中的基类的子对象subobject。

就像派生类的构造函数最在开始调用基类的构造函数,派生类的析构函数会在末尾调用基类的析构函数。基类的析构函数为虚的,那么派生类的析构函数自动为虚,虽然可以没有virtual 声明。

由于基类的引用和指针可以指向派生类,只有在运行时才能知道基类指针指向的到底是什么对象,所以对象的销毁必须等到运行时才能决定是调用哪一个析构函数。因为如果基类的析构函数非虚,在编译器就确定,当运行时若基类引用或指针指向的是派生类的对象的话,就可能会发生内存的销毁错误。

C++ 虚函数语义学相关推荐

  1. C++ 虚函数与存虚函数

    什么是虚函数: 虚函数 是在基类中使用关键字 virtual 声明的函数,在C++ 语言中虚函数可以继承,当一个成员函数被声明为虚函数之后,其派生类中的同名函数都自动生成为虚函数, 虚函数主要体验C+ ...

  2. 【C++】多态(早期绑定、后期绑定)、抽象类(纯虚函数)、虚析构函数

    我们都知道面向对象编程的三大特征是封装.继承.多态,今天我们就来说一下其中之一的多态. 概念: 多态: 多态字面意思就是多种形态,C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同 ...

  3. C#中虚函数,抽象,接口的简单说明

    虚函数:由virtual声明,它允许在派生类中被重写,要重写方法,必须先声名为virtual public class myclass { public virtual int myint() { 函 ...

  4. 提高C++性能的编程技术笔记:虚函数、返回值优化+测试代码

    虚函数:在以下几个方面,虚函数可能会造成性能损失:构造函数必须初始化vptr(虚函数表):虚函数是通过指针间接调用的,所以必须先得到指向虚函数表的指针,然后再获得正确的函数偏移量:内联是在编译时决定的 ...

  5. 但并不从包含函数声明的接口派生_C++的虚函数和纯虚函数

    虚函数:类成员函数前面添加virtual关键字,则该函数被称为虚函数. 纯虚函数:在虚函数的基础上,在函数末尾加上 = 0. class Animal {public: virtual void Sh ...

  6. c++ 虚函数_到底什么情况下会合成默认构造函数?

    来源:https://www.cnblogs.com/QG-whz/p/4676481.html 作者:good luck 编辑:公众号[编程珠玑] 编辑注:没有构造函数的时候编译器一定会生成默认构造 ...

  7. C++——虚函数(Virtual Member Functions) 【functions语意学】

    单继承下的虚函数 虚函数的实现: 为每个有虚函数的类配一张虚函数表(virtual table),它存储该类类型信息和所有虚函数执行期的地址. 为每个有虚函数的类插入一个指针(vptr),这个指针指向 ...

  8. 一口气搞懂《虚函数和纯虚函数》

    学习C++的多态性,你必然听过虚函数的概念,你必然知道有关她的种种语法,但你未必了解她为什么要那样做,未必了解她种种行为背后的所思所想.深知你不想在流于表面语法上的蜻蜓点水似是而非,今天我们就一起来揭 ...

  9. 虚函数实现的基本原理(转载)

    1.概述 每一个含有虚函数(无论是其本身就含有的,还是从基类继承过来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针.如下图所示 : 其中: B的虚函数表中存放着B:: ...

  10. C++中虚函数可以是内联函数吗?

    1.需要注意的几点: 虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联. 内联是在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因 ...

最新文章

  1. DataGrid连接Access的快速分页法——动态生成SQL语句
  2. 阿里 双11 同款,流量防卫兵 Sentinel go 源码解读
  3. ×××站点的路由(隧道、接口)模式和策略模式
  4. 机器学习java_Java机器学习,第2部分
  5. 动态规划——买卖股票的最好时机(Leetcode 121)
  6. 苹果支付35亿元和解iPhone“降速门”:国内用户又被忽略了
  7. 关于.NET异步调用的初步总结
  8. MySQL随机排序的正确姿势
  9. 如何在iconfont.cn 下载ttf格式的图标
  10. 【托业】【新托业TOEIC新题型真题】学习笔记13-题库四-P7
  11. 计算机中丢失cg,【计算机中丢失dll文件】计算机丢失dll文件_计算机中丢失cg dll-win7之家...
  12. MATLAB强化学习实战(十三) 使用强化学习智能体训练Biped机器人行走
  13. 使用java对文件夹中文件后缀进行修改
  14. Java行业薪资待遇一般都多少钱?
  15. 【WIN7系统不是万能滴】
  16. 2022,再见,2023,我来了!
  17. HDU - 5965 扫雷(dp[好理解,但不那么优的题解])
  18. 【机器学习】如何成为当下合格的算法工程师
  19. win10下修改jar中的文件
  20. iOS内存缓存和磁盘缓存的区别

热门文章

  1. 安利一个免费在线的pdf转word、excel、ppt
  2. winpe安装Windows 10系统时efi part有红叉怎么办。
  3. 美国区块链与药品供应链管理的应用案例
  4. 电脑知识:DOS命令使用
  5. wps怎么把ppt里的字体一起保存_WPS怎样将PPT中的文字导出为Word文档?
  6. Windows设置自己的程序开机自动启动
  7. python 多目标跟踪_多目标追踪器:用 OpenCV 实现多目标追踪(C++/Python)
  8. Uchome分页方法
  9. delphi 可以自定义边框的文本框TSkinNormalEdit思路(QQ2011风格)
  10. MarkDown学习手册