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

以这段代码为例。

#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;
}

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值