C++虚函数实现机制

本文深入探讨了C++虚函数的实现机制,包括类对象的内存布局,虚函数表(vtable)的工作原理,以及单继承和多继承情况下虚函数的处理方式。通过例子展示了虚函数如何影响类的大小以及对象的内存分配,强调了虚函数表的静态创建和共享特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++虚函数实现机制

C++程序的内存格局通常分为四个区:全局数据区,代码区,栈区,和堆区(即自由存储区)。
全局数据区存放全局变量,静态数据和常量;所有类成员函数和非成员函数代码存放在代码区;为运行函数而分配的局部变量,函数参数,返回数据,返回地址等存放在栈区,余下的空间都被成为堆区。
类成员函数是放在代码区,而类的静态成员变量在类定义时就已经在全局数据区分配了内存,因而它是属于类的。对于非静态成员变量,我们是在类的实例化过程中(构造对象)才在栈区或者堆区为其分配内存,是为每个对相关生成一个拷贝,所以它是属于对象的。
在这里插入图片描述

类的静态成员函数和非静态成员函数的区别

静态成员函数和非静态成员函数都是在类的定义时放在内存的代码区的,因而可以说它们都是属于类的。区别在于类的非静态类成员函数其实都内含了一个指向类对象的指针参数(即this指针),因而只有类对象才能调用(此时this指针有实值)。
所有说类的成员函数其实是有大小的,其大小为void的两倍。在64位的机器下,void的大小为8个字节,类成员函数的大小为16个字节,猜想是因为里面还存了一根this指针。

#include <iostream>
class IType {
public:
	void Show1() {
 
	}
};
class IType2 {
public:
	void Show2() {
 
	}
};
class MyClass : IType, IType2
{
public:
	void Show3() {}
};

int main()
{
	int a = sizeof(&MyClass::Show3);
	std::cout << sizeof(void *) << "," << a << std::endl; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值