关于c++中虚函数和虚函数表的创建时机问题

news/2025/2/21 18:35:03/

以这段代码为例。

#include <iostream>using namespace std;class Parent
{
public:Parent(){}virtual void func1() {};virtual void func2() {};
};class Child :public Parent
{
public:Child():n(0),Parent(){cout << "Child()" << endl;}virtual void func1() {};void func2() {};void func3() {};private:int n;
};int main()
{Child c;return 0;
}

1. 虚函数表

虚函数表在编译时创建

编译时,对于包含虚函数的类,编译器会自动先为各个类创建好它们各自的虚函数表,其中对于子类重写父类的虚函数等工作也都完成了。

类的函数(包括虚函数)存储在代码段;

类的虚函数表存储在数据区中。

2. 虚函数表指针_vftptr

虚函数表指针在运行时创建

实例化含虚函数的子类对象时,分以下几步走:

  1. 开辟内存空间
  2. 构造父类
  3. 在类的首地址处,填入编译时创建完毕的虚函数表的地址,即虚函数表指针
  4. 进入类的构造函数,执行初始化列表
  5. 执行构造函数body部分

就如上面那段代码,汇编语言:

在这里插入图片描述

⭕平时做题时经常遇到,在父类的构造函数中,通过指向子类的父类this指针,调用了虚函数,且子类中重写了该虚函数。但是,此时子类的虚函数表并未明确(虚函数表指针尚未填入),所以不会触发多态,还是会调用父类的虚函数。
在这里插入图片描述

补充:

初始化列表的初始化顺序与初始化列表顺序无关。

  1. 对于成员变量,按成员变量的声明顺序进行初始化。
  2. 对于父类构造,按继承的声明顺序正向进行构造。

而对于子类调用析构后,自动调用父类的析构,对于多个父类,安装继承的声明顺序反方向进行析构。

#include <iostream>using namespace std;class Parent
{
public:Parent(){cout << "Parent()" << endl;}~Parent(){cout << "~Parent()" << endl;}
};class Base
{
public:Base(){cout << "Base()" << endl;}~Base(){cout << "~Base()" << endl;}
};class Child :public Parent, public Base
{
public:Child():Base(),Parent(){cout << "Child()" << endl;}~Child(){cout << "~Child()" << endl;}
};int main()
{Child c;return 0;
}

在这里插入图片描述


http://www.ppmy.cn/news/989080.html

相关文章

pytorch的发展历史,与其他框架的联系

我一直是这样以为的&#xff1a;pytorch的底层实现是c(这一点没有问题&#xff0c;见下边的pytorch结构图),然后这个部分顺理成章的被命名为torch,并提供c接口,我们在python中常用的是带有python接口的&#xff0c;所以被称为pytorch。昨天无意中看到Torch是由lua语言写的&…

2023深圳杯数学建模C题

C题 无人机协同避障航迹规划 平面上A、B两个无人机站分别位于半径为500 m的障碍圆两边直径的延长线上&#xff0c;A站距离圆心1 km&#xff0c;B站距离圆心3.5 km。两架无人机分别从A、B两站同时出发&#xff0c;以恒定速率10 m/s飞向B站和A站执行任务。飞行过程中两架无人机…

【ribbon】Ribbon的使用与原理

负载均衡介绍 负载均衡&#xff08;Load Balance&#xff09;&#xff0c;其含义就是指将负载&#xff08;工作任务&#xff09;进行平衡、分摊到多个操作单元上进行运行&#xff0c;例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等&#xff0c;从而协同…

Spring之BeanDefinition(二)

Spring之BeanDefinition 文章目录 Spring之BeanDefinition1、对象和bean的区别2、BeanDefinition作用AutowireCandidate说明Primary说明ConstructorArgumentValues说明第一种使用方式第二种使用方式 MutablePropertyValuesabstract小结 3、BeanDefinition的发展历程3、BeanDefi…

SpringBoot集成Thymeleaf

Spring Boot 集成 Thymeleaf 模板引擎 1、Thymeleaf 介绍 Thymeleaf 是适用于 Web 和独立环境的现代服务器端 Java 模板引擎。 Thymeleaf 的主要目标是为开发工作流程带来优雅的自然模板&#xff0c;既可以在浏览器中正确显示的 HTML&#xff0c;也可以用作静态原型&#xf…

【跨代码仓库合并方案】

1、背景&#xff1a; 1、wiser绑定的uiidA的定制修改内容和ELKO绑定的uiidB基本是一样的&#xff0c;需要手动粘贴同步&#xff0c;增加测试保障风险&#xff0c;还会浪费开发资源投入&#xff1b; 2、施耐德wiser和elko面板两套面板基本一致&#xff0c;但是经过new art升级后…

[NLP]LLaMA与LLamMA2解读

摘要 Meta最近提出了LLaMA(开放和高效的基础语言模型)模型参数包括从7B到65B等多个版本。最值得注意的是&#xff0c;LLaMA-13B的性能优于GPT-3&#xff0c;而体积却小了10倍以上&#xff0c;LLaMA-65B与Chinchilla-70B和PaLM-540B具有竞争性。 一、引言 一般而言&#xff0…

Linux文件系统中目录介绍

linux的文件系统&#xff1a; 根文件系统&#xff08;rootfs&#xff09;:fhs:文件系统目录标准 Filesystem Hierarchy Standard /boot:引导文件的存放目录&#xff1a;内核文件、引导加载文件都存放在此目录 /bin&#xff1a;共所有用户使用的基本命令&#xff0c;不能管理至…