用一段简单的代码解释若派生类重写/覆盖/修改了基类的基函数,编译器就会把虚函数表中的函数入口地址改为派生类中对应的虚函数入口地址
时间: 2024-05-02 17:21:51 浏览: 10
下面是一个简单的代码示例:
```c++
#include <iostream>
class Base {
public:
virtual void func() {
std::cout << "Base::func()" << std::endl;
}
};
class Derived : public Base {
public:
virtual void func() {
std::cout << "Derived::func()" << std::endl;
}
};
int main() {
Base* ptr = new Derived();
ptr->func();
delete ptr;
return 0;
}
```
在这个示例中,基类 `Base` 定义了一个虚函数 `func()`,派生类 `Derived` 重写了这个函数。在 `main()` 函数中,我们创建了一个 `Derived` 类型的对象,并将其指针赋给了一个 `Base` 类型的指针 `ptr`。然后调用 `ptr` 指向的对象的虚函数 `func()`,这会导致派生类 `Derived` 中的 `func()` 被调用。
编译器为了支持动态绑定,会将虚函数表中的函数入口地址指向派生类中对应的虚函数入口地址。因此,当我们调用虚函数 `func()` 时,编译器会根据指针指向的对象的实际类型来定位虚函数表中的函数入口地址,并跳转到正确的函数实现。在本例中,由于 `ptr` 指向的对象是 `Derived` 类型的,所以虚函数表中的函数入口地址会被改为 `Derived::func()` 的地址,因此调用 `ptr->func()` 时会输出 `Derived::func()`。