• 虚函数的调用一定是动态联编吗?


    昨天看到一句话:对虚函数的调用不一定是动态联编,我的映像中一直以为虚函数就是动态联编的,所以记录下来。

    一、动态联编是什么?

    引自多态的概念:当不同的对象调用相同的名称的成员函数时,可能引起不同的行为(执行不同的代码),这种现象叫多态性。将函数调用链接相应函数体的代码的过程称为函数联编。在C++中,分为静态联编和动态联编。

    静态联编:不同的类可以有同名的成员或函数,编译器在编译时对它们进行函数联编,这种在编译时刻进行的联编称为静态联编,也称为编译时多态性函数重载属于这种。

    动态联编:在程序运行时才能确定调用哪个函数,也称为运行时多态性。在C++中,只有虚函数才可能是动态联编的,可以通过定义类的虚函数和创建派生类,在派生类中重新实现虚函数,实现具有运行时的多态性。

    二、如何调用静态联编的虚函数?(请参考 https://blog.csdn.net/chijianxingfeng/article/details/8870387 文章中的例子通俗易懂,文中称为实调用

    1.例子:(派生类对象作为参数,传给基类的形参)

    #include <iostream>
    using namespace std;
     
    class A
    {
    public:
        virtual void show()
        {
            cout<<"in A::show()
    ";
        }
    };
     
    class B:public A
    {
    public:
        void show()
        {
            cout<<"in B::show()
    ";
        }
    };
     
    void func(A a)
    {
        a.show();    //a是A的一个实例,并不是指向类A对象的指针或引用,所以为实调用。
    }
     
    int main()
    {
        B b;
        func(b);    //调用类A的拷贝构造函数,产生一个A类对象作为a进入函数func()的函数体
                //在函数体内,a是一个纯粹的类A对象,与类型B毫无关系
        return 0;
    }
    View Code

    输出:

    2.例子:(构造函数中调用虚函数)

    #include <iostream>
    using namespace std;
     
    class A
    {
    public:
        virtual void show()
        {
            cout<<"in A::show()
    ";
        }
        A()
        {
            cout<<"A()
    ";    
            show();    //调用虚函数
        }
    };
    
    class B:public A
    {
    public:
        void show()
        {
            cout<<"in B::show()
    ";
        }
        B()
        {    
            cout<<"B()
    ";    
            //show();    //
        }
    };
     
    int main()
    {
        A a;
        B b;
        return 0;
    }
    View Code

    输出:

  • 相关阅读:
    自定义 mapper
    solr 服务搭建
    jedis 连接redis
    jedis 整合 Spring
    Redis 安装
    HttpClient 工具类
    springMvc 中返回字符串 乱码解决
    linux常用命令解析
    压缩jar包
    控制反转
  • 原文地址:https://www.cnblogs.com/Brickert/p/10705390.html
Copyright © 2020-2023  润新知