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

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

一、动态联编是什么?

引自多态的概念:当不同的对象调用相同的名称的成员函数时,可能引起不同的行为(执行不同的代码),这种现象叫多态性。将函数调用链接相应函数体的代码的过程称为函数联编。在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()\n";
    }
};
 
class B:public A
{
public:
    void show()
    {
        cout<<"in B::show()\n";
    }
};
 
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()\n";
    }
    A()
    {
        cout<<"A()\n";    
        show();    //调用虚函数
    }
};

class B:public A
{
public:
    void show()
    {
        cout<<"in B::show()\n";
    }
    B()
    {    
        cout<<"B()\n";    
        //show();    //
    }
};
 
int main()
{
    A a;
    B b;
    return 0;
}
View Code

输出:

 

posted @ 2019-04-15 14:13  Brickert  Views(3210)  Comments(0Edit  收藏  举报