C++ 虚函数畅谈
2024-10-16 02:39:26
0x01:前言
虚函数是C++里最重要的概念之一,并且是判定C++是否入门的一个热门问题。今天这篇文章简单谈谈虚函数。
0x02:虚函数简介
虚函数可以被子类实现函数所覆盖。
virtual是关键字,被定义为virtual的函数才可以被子类覆盖。
虚函数的调用是通过虚函数指针调用。
0x03:虚函数原理
下面展示的代码皆为伪码,主要为说明虚函数编译和调用过程。
class Base
{
public:
virtual void Play();
virtual void Move();
virtual void Attack();
void EndGame();
};
在这里Base类在编译时会生成虚函数表: FunctionPtr* Base::__vtable[3] = {&Base::Play(), &Base::Move(), &Base::Attack()}
在生成Base对象时,会生成虚函数指针 FunctionPtr* Base::__vptr;
class Base
{
public:
Base():__vptr(__vtable[0])
{
}
FunctionPtr* __vptr;
};
假设如下场景:
Base b;
b.Move(); // b.__vptr[1]();
如果通过继承,变的只是虚函数表。
class Derived : public Base
{
public:
void Move() override;
}
此时虚函数表:FunctionPtr* __vtable[3] = {&Base::Play(), &Derived::Move(), &Base::Attack()}
0x04:虚函数性能
对于调用消耗是非常小的,不过对于效率要求非常严苛的使用场景另当别论。效率更多是转化成经济效益计算。提高效率,开发难度和时间本来是此起彼消的。
最新文章
- Java开发环境搭建——Tomcat配置
- 也说php从mysql数据库通过服务器端json返回数据出现乱码问题
- 制作部署安装包:Inno Setup
- centos 减少tty数量的方法
- iOS开发——高级技术&;二维码功能的实现
- Android中为窗口定义主题
- LED驅動芯片 兩種恒流控制方式
- 使用malloc分别分配2KB,6KB的内存空间,打印指针地址
- AMR音频编码器概述及文件格式分析
- 使用excel微调button调整日期
- spring boot项目发布tomcat容器(包含发布到tomcat6的方法)
- 使用vs编译事件来动态发布配置文件
- ROS学习笔记
- FileReader读取本地文件
- BugkuCTF~Mobile~WriteUp
- Codeforces 581F Zublicanes and Mumocrates 树形dp
- C和 C++的特点
- Trident中的解析包含的函数操作与投影操作
- ElasicSearch(2) Linux运行
- 浅谈Java泛型中的? extends E和?super E