虚函数如何实现多态?虚函数底层机制是什么?

一个C++面试中经常遇到的题目
多态的实现主要分为静态多态动态多态静态多态主要是重载(函数重载,运算符重载),在编译的时候就已经确定;动态多态是用虚函数机制实现的,在运行期间动态绑定。举个例子:一个父类类型的指针指向一个 子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写 过后的函数,在父类中声明为加了 virtual 关键字的函数,在子类中重写时候不需要加 virtual 也是虚函数。
虚函数的实现:
1.在有虚函数的类中,当类实例化为对象时,最开始部分是一个虚函数表的指针,这个指针指向一个 虚函数表,表中放了虚函数的地址,实际的虚函数在代码段(.text)中。
2.当子类继承了父类的时 候也会继承其虚函数表,当子类重写父类中虚函数时候,会将其继承到的虚函数表中的地址替换为重新写的函数地址,即虚表指针指向子类的虚表。
3.使用了虚函数,会增加访问内存开销,降低效率。
下面是一些图例可以增加理解:
https://jacktang816.github.io/post/virtualfunction/

class A {
  public:
    virtual void v_a(){}
    virtual ~A(){}
    int64_t _m_a;
};

int main(){
    A* a = new A();
    return 0;
}

虚函数如何实现多态?虚函数底层机制是什么?_第1张图片
这就是如何通过虚函数表找到虚函数的示意图,当派生类重写虚函数是,虚表指针就指向子类的虚表了

你可能感兴趣的:(C++八股文,c++,c语言,开发语言)