
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:虚函数性能
对于调用消耗是非常小的,不过对于效率要求非常严苛的使用场景另当别论。效率更多是转化成经济效益计算。提高效率,开发难度和时间本来是此起彼消的。