在 C++ 中,虚函数(Virtual Function) 是实现多态性(Polymorphism)的核心机制,多态性允许程序在运行时根据对象的实际类型来决定调用哪个函数。
假如有如下两个类Entity、Player
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Entity
{
public:
virtual std::string GetName() { return "Entity"; } // 指定该函数为虚函数
};
// Player类继承Entity类
class Player : public Entity
{
private:
std::string m_Name;
public:
Player(const std::string& name)
{
m_Name = name;
}
std::string GetName() override { return m_Name; } // override 指定该函数重写了父类的虚函数,这不是必须的,但它提供了更好的可读性。
};
|
我们希望:
- 当我们传入Entity* 类型时打印"Entity"
- 而我们传入Player* 类型时打印"Player"
1
2
3
4
5
6
7
8
9
10
11
12
13
|
void PrintName(Entity* entity)
{
std::cout << entity->GetName() << std::endl;
}
int main()
{
Entity* entity = new Entity();
PrintName(entity);
Player* player = new Player("Player");
PrintName(player);
}
|
删除基类的virtual关键字看看会发生什么?
- 核心作用:实现运行时多态,通过基类接口操作派生类对象。
- 关键机制:虚函数表(vtable)和虚函数指针(vptr)。
- 必用场景:基类析构函数、接口抽象(纯虚函数)。
- 慎用场景:性能敏感代码、构造函数/析构函数中调用虚函数。
- 现代改进:override 和 final 增强安全性。