MST

星途 面试题库

面试题:C++中虚拟函数动态绑定的基础实现

请描述C++中虚拟函数动态绑定的基本过程,包括在类继承体系下,对象如何通过虚函数表来实现运行时的动态绑定。并给出一个简单的代码示例来展示这一过程。
46.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

虚拟函数动态绑定基本过程

  1. 编译期准备
    • 当一个类中包含虚函数时,编译器会为该类生成一个虚函数表(vtable)。虚函数表是一个存储该类虚函数地址的数组。
    • 每个包含虚函数的类的对象都包含一个指向该虚函数表的指针(vptr),这个指针通常被编译器安放在对象的首部。
  2. 运行时绑定
    • 在类继承体系下,当通过基类指针或引用调用虚函数时,程序会在运行时根据对象实际的类型来确定调用哪个版本的虚函数。
    • 具体过程为:首先通过对象的vptr找到对应的虚函数表,然后根据虚函数在虚函数表中的索引找到实际要调用的虚函数的地址,最后调用该函数。

代码示例

#include <iostream>

class Base {
public:
    virtual void print() {
        std::cout << "Base::print()" << std::endl;
    }
};

class Derived : public Base {
public:
    void print() override {
        std::cout << "Derived::print()" << std::endl;
    }
};

int main() {
    Base* basePtr = new Base();
    basePtr->print(); // 调用 Base::print()

    basePtr = new Derived();
    basePtr->print(); // 调用 Derived::print(),动态绑定

    delete basePtr;
    return 0;
}

在上述代码中,Base类包含一个虚函数printDerived类继承自Base类并覆盖了print函数。在main函数中,通过Base类指针分别指向Base类对象和Derived类对象,调用print函数时,根据对象实际类型实现了动态绑定。