虚函数表
当一个类中声明了虚函数时,这个函数在编译时会被标记为虚函数,并且对应的虚函数表中会为这个类生成一个虚函数表;
当基类指针指向派生类对象时,如果这个函数被调用,实际上调用的是派生类中的函数。这是因为在派生类中,虚函数表被重写了,指针指向了派生类中的对应函数。
cpp
```cpp
#include <iostream>
// 基类 Animal
class Animal {
public:
// 虚函数 speak,可以被派生类重写
virtual void speak() {
std::cout << "Animal speaks" << std::endl;
}
};
// 派生类 Dog,继承自 Animal
class Dog : public Animal {
public:
// 重写基类的虚函数 speak
void speak() override {
std::cout << "Dog barks" << std::endl;
}
};
// 派生类 Cat,继承自 Animal
class Cat : public Animal {
public:
// 重写基类的虚函数 speak
void 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;
}