虚函数表
当一个类中声明了虚函数时,这个函数在编译时会被标记为虚函数,并且对应的虚函数表中会为这个类生成一个虚函数表;
当基类指针指向派生类对象时,如果这个函数被调用,实际上调用的是派生类中的函数。这是因为在派生类中,虚函数表被重写了,指针指向了派生类中的对应函数。
```cpp#include <iostream>// 基类 Animal
class Animal {
public:// 虚函数 speak,可以被派生类重写virtual void speak() {std::cout << "Animal speaks" << std::endl;}
};// 派生类 Dog,继承自 Animal
class Dog : public Animal {
public:// 重写基类的虚函数 speakvoid speak() override {std::cout << "Dog barks" << std::endl;}
};// 派生类 Cat,继承自 Animal
class Cat : public Animal {
public:// 重写基类的虚函数 speakvoid speak() override {std::cout << "Cat meows" << std::endl;}
};int main() {// 创建 Animal 类型的指针,指向派生类对象Animal* animal;// 创建 Dog 对象并将其地址赋给 animal 指针animal = new Dog();// 调用虚函数 speak,实际调用的是 Dog 类中的 speak 函数animal->speak(); // 输出: Dog barks// 创建 Cat 对象并将其地址赋给 animal 指针animal = new Cat();// 调用虚函数 speak,实际调用的是 Cat 类中的 speak 函数animal->speak(); // 输出: Cat meows// 释放内存delete animal;return 0;
}