首页 > 其他分享 >虚表指针初始化顺序

虚表指针初始化顺序

时间:2023-05-31 10:22:24浏览次数:29  
标签:初始化 虚表 函数 列表 指针 赋值

无继承时:

1、分配内存
2、初始化列表之前赋值虚表指针
3、列表初始化
4、执行构造函数体

有继承时:

1、分配内存
2、基类构造过程(按照无继承来)
3、初始化子类虚表指针
4、子类列表初始化
5、执行子类构造函数体

Q:虚表指针在初始化列表之前被赋值,可以放在初始化列表之后赋值吗?即顺序是:列表初始化、虚表指针赋值、构造函数体??

class B
{
public:
	virtual int size(){return 0;}
};


class A:public B{
public:
	int m_a; 
	A():m_a(size())   //在初始化列表中调用了虚函数(应该是A类的size()函数,不应该是B类的size()函数)
	{
		cout<<m_a<<endl;
	}
	virtual int size(){
		//cout<<2<<endl;
		return 1;}
};

int main()
{
	A a;
	return 0;
}

解答:如果虚表指针的初始化在初始化列表之后的话,可能会出现如上代码所示的情况:也就是说,在初始化列表中使用了一个虚函数!!!
那么在调用此虚函数的时候,应该访问哪个虚表呢?是基类的虚表?还是当前类的虚表?

毫无疑问,应该是当前类的虚表!!!
但是在调用此虚函数的时候,虚表指针并未赋值为子类的虚表,所以无法访问当前类的虚函数,访问的依旧是基类的虚函数。

因此,将虚表指针的赋值过程应该放置在初始化列表之前,这是为了防止在初始化列表出现调用虚函数的情况!!!

标签:初始化,虚表,函数,列表,指针,赋值
From: https://www.cnblogs.com/tomato-haha/p/17445321.html

相关文章

  • spring boot 集成 swagger 空指针异常
    刚开始使用的是2.6.4的springboot集成的是swagger3,启动时报npe百度了一下可能是版本不兼容,说swagger3适用2.4以上,我心想这也没错哇,,又百度了一下说版本高也不行只能是2.5.7以下原文链接:https://blog.csdn.net/qq_53860947/article/details/124411891 2023-05-18......
  • 前后端项目初始化
    前端前端项目初始化(AntDesignPro)步骤:按照官方文档初始化https://pro.ant.design/zh-CN/docs/getting-started/项目试运行(npmrundev/start)代码托管移出不必要的能力,对项目进行瘦身(比如国际化)自动生成增删查改代码后端可以用mybatisX插件生成代码,那前端可以自动......
  • python二维数组初始化
    >>>a=[[0]*3foriinrange(3)]>>>a[[0,0,0],[0,0,0],[0,0,0]]>>>a[1][1]=121>>>a[[0,0,0],[0,121,0],[0,0,0]]>>>a[0][0]=11>>>a[[11,0,0],[0,121,0],[0,0,0]]>>>......
  • 为什么 C++ 有指针了还要引用
    引用传递,只是明面上,没有使用值传递,值传递本身是不可避免的。编译器,暗地里通过指针(或者其他可以替代指针的数据类型)的值传递,替换了引用传递。所以引用传递,实质上是地址传递,别名这东西只是概念,是一种抽象,别名是没法传递的。别名,可不是真实的数据类型。因为,函数传递参数需要,数据复制,......
  • UE4 源码解析----引擎初始化流程
      在研究UE4的源码过程中着实不理解的地方有很多,今天给大家分享一下UE4引擎的初始化流程。一、引擎的函数入口C++的函数入口都是Main()函数入口,UE4也是一样,Engine\Source\Runtime\Launch\PrivateWindows函数入口 引擎入口函数为:GuardedMain 二、引擎初始化的三个阶......
  • 结构体就算不用构造函数也可以初始化
    标题结构体就算不用构造函数也可以初始化#include<iostream>#include<vector>#include<algorithm>#include<string>#include<queue>#include<set>usingnamespacestd;structstateAndLevel{ stringstr; intlevel;};queue<stateAndLevel>......
  • 九大组件初始化
    1上图2九大组件是在DispatcherServlet的onRefresh方法中初始化的3根据断点可以看出Tomcat启动会触发HttpServletBean的init方法,后续会进行容器的刷新触发refresh方法,容器刷新之后会发布事件4FrameworkServlet实现了监听器 5监听会触发开始的onRefresh方法 6总结......
  • #yyds干货盘点# LeetCode程序员面试金典:填充每个节点的下一个右侧节点指针 II
    题目:给定一个二叉树:structNode{ intval; Node*left; Node*right; Node*next;}填充它的每个next指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将next指针设置为NULL。初始状态下,所有 next指针都被设置为NULL。 示例1:输入:root=[1,2,3......
  • 关于一些指针
    #include<iostream>usingnamespacestd;voidPrintf(int(*p)[2],intp1,intp2){ for(inti=0;i<p1;i++) { for(intj=0;j<p2;j++) { cout<<p[i][j]; } }}voidPrint(int*p,intp1){}intmain(){ chara[]={'x',�......
  • leetcode1657vector的初始化和比较
    满足相似的条件:1.长度一样2.组成的字母组合相同3.每个组成字母的个数集合相同比较两个vector,直接用==/!=排序vectorsort(迭代器1,迭代器2);初始化vector形式:vector<类型>name(形式)if(word1.lenth()!=word2.length())returnfalse;//长度不同vector<int>v2(26,0),v1(2......