面试题答案
一键面试-
多态实现的三个必要条件:
- 继承:存在一个基类和至少一个派生类,派生类从基类继承成员。
- 虚函数重写:基类中定义虚函数,派生类对该虚函数进行重写(函数原型相同,包括函数名、参数列表和返回类型,协变返回类型除外)。
- 通过基类指针或引用调用虚函数:只有通过基类指针或引用调用虚函数时,才会发生动态绑定,实现多态。
-
代码验证虚函数表在多态中的作用:
#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
类定义了虚函数func
,Derived
类重写了func
。通过获取虚函数表指针并调用其中的函数,模拟了多态的动态绑定过程,同时通过basePtr->func()
常规的多态调用方式再次验证。两种方式最终都调用到了Derived::func()
,体现了虚函数表在多态中的作用。