MST

星途 面试题库

面试题:C++ 多态必要条件验证之中等难度

在C++中,简述多态实现的三个必要条件,并编写一段简单代码验证虚函数表在多态中的作用。
38.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 多态实现的三个必要条件

    • 继承:存在一个基类和至少一个派生类,派生类从基类继承成员。
    • 虚函数重写:基类中定义虚函数,派生类对该虚函数进行重写(函数原型相同,包括函数名、参数列表和返回类型,协变返回类型除外)。
    • 通过基类指针或引用调用虚函数:只有通过基类指针或引用调用虚函数时,才会发生动态绑定,实现多态。
  2. 代码验证虚函数表在多态中的作用

#include <iostream>

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

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

int main() {
    Base* basePtr = new Derived();
    // 获取虚函数表指针,不同编译器获取方式可能略有不同,这里以常见x86_64 gcc编译器为例
    typedef void (*FuncPtr)();
    FuncPtr* vtablePtr = reinterpret_cast<FuncPtr*>(*(reinterpret_cast<unsigned long*>(basePtr)));
    FuncPtr funcPtr = vtablePtr[0];
    funcPtr();
    basePtr->func();
    delete basePtr;
    return 0;
}

在上述代码中,Base类定义了虚函数funcDerived类重写了func。通过获取虚函数表指针并调用其中的函数,模拟了多态的动态绑定过程,同时通过basePtr->func()常规的多态调用方式再次验证。两种方式最终都调用到了Derived::func(),体现了虚函数表在多态中的作用。