虚函数以及静态绑定与动态绑定简单总结

本文深入探讨虚函数如何影响类的行为,包括虚函数表(vftable)的生成,对象内存布局的变化,以及动态绑定与静态绑定的区别。同时,文章还讲解了重载、隐藏与覆盖的概念,并解释了为何某些情况下虚函数的调用并非动态绑定。

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

一个类添加了虚函数,对这个类有什么影响?

一个类里面定义了虚函数,那么编译阶段,编译器会给这个类类型产生一个唯一的虚函数表(vftable),虚函数表里面储存的内容主要是RTTI指针和虚函数的地址。当程序运行时,每张虚函数表都会加载到内存的.rodata区。

一个类里定义了虚函数,那么这个类定义的对象,其运行时,内存中开始的部分会多储存一个vfptr虚函数指针,指向对应类型的虚函数表。一个类型定义的n个对象,vfptr指向的都是同一张虚函数表。

一个类中定义多个虚函数,不会影响对象内存的大小,只会影响虚函数表的大小。

如果派生类的方法和基类继承来的某个方法,返回值、函数名、参数列表都相同,而且基类的方法是虚函数,那么派生类中的这个方法自动处理成虚函数。

静态绑定与动态绑定的区别?

静态绑定是编译时期的绑定,绑定的是普通函数的调用;动态绑定是运行时期的绑定,绑定的是对虚函数的调用

**重载:**一组函数要重载,必须处在同一作用域下,而且名字相同,参数列表不同。
**隐藏:**在继承结构中,派生类的同名成员,把基类的同名成员给隐藏了。
**覆盖:**基类和派生类的方法,返回值、函数名、参数列表都相同,而且基类的方法是虚函数,那么派生类的方法就自动处理成虚函数,他们之间成为覆盖关系。

哪些函数不能处理成虚函数?
虚函数依赖:
1.虚函数能产生地址,储存在vftable中。
2.对象必须存在(vfptr->vatable->虚函数地址)

派生类对象的构造过程:
1.先调用的是基类的构造函数
2.再调用派生类的构造函数

什么时候 把基类的析构函数必须实现成虚函数?
基类的指针(引用)指向堆上new出来的派生类对象的时候
它在调用析构函数的时候,必须发生动态绑定,否则会导致派生类的析构函数无法调用

是不是虚函数一定是动态绑定?
不是,在类的构造函数中,调用虚函数,是静态绑定,不会发生动态绑定,用对象本身调用虚函数,也是静态绑定。必须由指针或者引用调用虚函数,才会发生动态绑定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值