zoukankan      html  css  js  c++  java
  • C++ 虚函数畅谈

    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

  • 相关阅读:
    jmeter接口测试1-参数化
    关于python线程池threadpool
    scrapy---setting的字段含义
    urlparse 用法
    scrapy(1)win安装
    sublime
    python函数可变参数*args和**kwargs区别
    webservice接口测试wsdl
    charles使用
    K:栈相关的算法
  • 原文地址:https://www.cnblogs.com/fengju/p/6174277.html
Copyright © 2011-2022 走看看