C++——静态联编和动态联编、虚函数

静态联编和动态联编

程序调用函数时,将使用哪个可执行代码块呢?编译器负责回答这个问

题。将源代码中的函数调用解释为执行特定的函数代码块被称为函数名联编

(binding)。在C语言中,这非常简单,因为每个函数名都对应一个不同的

函数。在C++中,由于函数重载的缘故,这项任务更复杂。编译器必须查看

函数参数以及函数名才能确定使用哪个函数。然而,C/C++编译器可以在编

译过程完成这种联编。在编译过程中进行联编被称为静态联编(static

binding),又称为早期联编(early binding)。然而,虚函数使这项工作变得

更困难。正如在程序清单13.10所示的那样,使用哪一个函数是不能在编译时

确定的,因为编译器不知道用户将选择哪种类型的对象。所以,编译器必须

生成能够在程序运行时选择正确的虚方法的代码,这被称为动态联编

(dynamic binding),又称为晚期联编(late binding)。

 

 

C++多态、虚函数

C++多态(polymorphism)是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。

 

最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,动态绑定。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。

 

用下面代码演示多态和非多态。

 

#include 

using namespace std; 

 

class A 

public: 

    void foo() 

    { 

        printf("1\n"); 

    } 

    virtual void fun() 

    { 

        printf("2\n"); 

    } 

}; 

 

 

 

class B : public A 

public: 

    void foo()  //隐藏:派生类的函数屏蔽了与其同名的基类函数

    { 

        printf("3\n"); 

    } 

    void fun()  //多态、覆盖

    { 

        printf("4\n"); 

    } 

}; 

 

 

 

 

int main(void) 

    A a; 

    B b; 

    A *p = &a; 

    p->foo();  //输出1

    p->fun();  //输出2

    p = &b; 

    p->foo();  //取决于指针类型,输出1

    p->fun();  //取决于对象类型,输出4,体现了多态

    return 0; 

}

你可能感兴趣的:(灌水刷积分)