C++ 虚函数畅谈

来源:互联网 发布:美国亚马逊 买书 知乎 编辑:程序博客网 时间:2024/06/10 23:46

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

0 0