首页 > 试题广场 >

简述一下 C++ 中的多态

[问答题]
推荐

得分点

静态多态、动态多态、多态的实现原理、虚函数、虚函数表

参考答案

标准回答

在现实生活中,多态是同一个事物在不同场景下的多种形态。在面向对象中,多态是指通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为,与之相对应的编译时绑定函数称为静态绑定。所以多态分为静态多态和动态多态。

  1. 静态多态

    静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数就调用,没有的话就会发出警告或者报错。静态多态有函数重载、运算符重载、泛型编程等。

  2. 动态多态

    动态多态是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。当父类指针(引用)指向 父类对象时,就调用父类中定义的虚函数;即当父类指针(引用)指向 子类对象时,就调用子类中定义的虚函数。

加分回答

  1. 动态多态行为的表现效果为:同样的调用语句在实际运行时有多种不同的表现形态。

  2. 实现动态多态的条件:

    • 要有继承关系
    • 要有虚函数重写(被 virtual 声明的函数叫虚函数)
    • 要有父类指针(父类引用)指向子类对象
  3. 动态多态的实现原理

    当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储类虚函数指针的数据结构,
    虚函数表是由编译器自动生成与维护的。virtual 成员函数会被编译器放入虚函数表中,存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr 指针)。在多态调用时, vptr 指针就会根据这个对象在对应类的虚函数表中查找被调用的函数,从而找到函数的入口地址。

编辑于 2021-09-15 11:19:48 回复(0)
多态包括两种方式:重写和重载。
重写是指成员函数的名字不变,参数的类型数量顺序都不变,即只改变花括号内的函数体。
重载是指成员函数的名字不变,参数的类型数量顺序可以改变,函数体也可以改变,在调用时会根据参数的不同来选择调用哪一个函数。
发表于 2022-05-08 16:23:24 回复(0)