• 技术文章 >后端开发 >C#.Net教程

    详解C++虚成员函数和动态联编

    hzchzc2020-07-01 16:23:33转载56

    推荐学习: 《c++教程

    ——编译器对非虚方法使用静态联编(编译时匹配),对虚方法使用动态联编(运行时匹配)。

      静态联编比动态联编效率高。

      虚函数的工作原理。

      虚函数。

      重新定义成员函数(改变函数特征标)。

      重新定义重载的成员函数。

    效率

    为使程序能够在运行阶段进行决策,必须采取一些方法来跟踪基类指针或引用指向的对象类型,这增加了额外的处理开销。因此下列情况更适合静态联编:

    因此静态联编被设置为C++的默认选择。

    如果要在派生类中重新定义基类的方法,则将它设置为虚方法;否则设置为非虚方法。

    虚函数的工作原理

    编译器处理虚函数的方法是:给每个对象添加一个隐藏成员。隐藏成员中保存了一个指向·函数地址·数组的指针。这种数组被称为虚函数表(vtbl),表中存储了为类对象进行声明的虚函数的地址。

    派生类对象将包含一个指向独立地址表的指针(即新创建一个表)。(增加内存开销)

    调用虚函数时,程序将查看存储在对象中的vtbl地址,然后转向相应的函数地址表并在表中查找地址。(影响执行速度)

    总之,使用虚函数将在内存和执行速度上有一定的成本;即使非函数的效率比虚函数稍高,却不具备动态联编功能。

    构造函数不能是虚函数。

    析构函数应当是虚函数,除非类不用做基类。

    友元函数不能是虚函数,因为友元不是类成员,而只有成员才可以是虚函数。

    如果派生类没有重新定义函数,将使用该函数的基类版本(继承它)。如果派生类位于派生链中,则将使用最新的虚函数版本(指针或引用调用),基类版本被隐藏的情况除外。

    重新定义将隐藏基类方法:

    class Dwelling
    {public:    virtual void showperks(int a) const;
        ...
    };class Hovel : public Dwelling
    {public:    virtual void showperks() const;
        ...
    }

    在派生类中重新定义函数(改变了参数特征标),将隐藏同名的基类方法,而不是重载基类方法。

    Hovel trump;
    trump.showperks();    // validtrump.showperks(5);    // invalid

    如果重新定义继承的方法,应确保与原来的原型完全相同。如果返回类型为基类引用或指针,则可以修改为指向派生类的引用或指针(返回类型协变:即允许返回类型随类类型的变化而变化)。

    如果基类声明被重载了,则应在派生类中重新定义所有的基类版本;如果只定义了一个版本,则其它版本将被隐藏,派生类对象将无法使用它们。

    class Dwelling
    {public:    virtual void showperks(int a) const;    virtual void showperks(double x) const;    virtual void showperks() const;
        ...
    };class Hovel : public Dwelling
    {    virtual void showperks(int a) const;    virtual void showperks(double x) const;    virtual void showperks() const;
        ...
    };

    如果不需要修改,则新定义可只调用基类版本:

    void Hovel::showperks()const {Dwelling::showperks();}

    以上就是详解C++虚成员函数和动态联编的详细内容,更多请关注php中文网其它相关文章!

    本文转载于:cnblogs,如有侵犯,请联系a@php.cn删除
    专题推荐:C++
    上一篇:c语言绝对值怎么表示 下一篇:C++在构造函数中使用new时,需要注意这些事!
    第12期线上培训班

    相关文章推荐

    • C#中在构造函数中访问虚成员有什么问题?• c++标识符命名规则• c语言中double是什么意思• c语言逗号运算符用法是什么?

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网