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:虚函数性能

对于调用消耗是非常小的,不过对于效率要求非常严苛的使用场景另当别论。效率更多是转化成经济效益计算。提高效率,开发难度和时间本来是此起彼消的。

参考:https://isocpp.org/wiki/faq/virtual-functions

最新文章

  1. Java开发环境搭建——Tomcat配置
  2. 也说php从mysql数据库通过服务器端json返回数据出现乱码问题
  3. 制作部署安装包:Inno Setup
  4. centos 减少tty数量的方法
  5. iOS开发——高级技术&二维码功能的实现
  6. Android中为窗口定义主题
  7. LED驅動芯片 兩種恒流控制方式
  8. 使用malloc分别分配2KB,6KB的内存空间,打印指针地址
  9. AMR音频编码器概述及文件格式分析
  10. 使用excel微调button调整日期
  11. spring boot项目发布tomcat容器(包含发布到tomcat6的方法)
  12. 使用vs编译事件来动态发布配置文件
  13. ROS学习笔记
  14. FileReader读取本地文件
  15. BugkuCTF~Mobile~WriteUp
  16. Codeforces 581F Zublicanes and Mumocrates 树形dp
  17. C和 C++的特点
  18. Trident中的解析包含的函数操作与投影操作
  19. ElasicSearch(2) Linux运行
  20. 浅谈Java泛型中的? extends E和?super E

热门文章

  1. 使用iterator出现的死循环
  2. 参加 TiD 2015 是怎样一番体验?
  3. Xamarin开发Anroid应用介绍
  4. java生成字符串md5函数类
  5. POJ2186 Popular Cows(强连通分量)
  6. C#二进制与字符串之间的相互转换
  7. BZOJ3483 : SGU505 Prefixes and suffixes(询问在线版)
  8. C++中inline这个玩意儿
  9. css3中的几何图形shape研究
  10. CSS对浏览器的兼容性(IE和Firefox)技巧整理