C++虚函数:代码世界的"替身使者"(从青铜到王者完全指南)
一、虚函数是什么?为什么需要它?
1.1 没有虚函数的尴尬世界
假设你开发了一个游戏,里面有各种角色:
class Character {
public:
void Attack() {
cout << "平A" << endl; }
};
class Mage : public Character {
public:
void Attack() {
cout << "火球术" << endl; }
};
class Archer : public Character {
public:
void Attack() {
cout << "蓄力射击" << endl; }
};
// 使用示例
Character* ptr = new Mage();
ptr->Attack(); // 输出"平A"!法师变成了战五渣 😱
在这里ptr->Attack();
调用的是基类 Character
的 Attack
函数,输出 “平 A”,而不是派生类 Mage
的 Attack
函数,这是因为在 C++ 里,普通成员函数调用遵循静态绑定机制,由于ptr
是Character
类型的指针,所以编译器在编译时就决定调用 Character
类的 Attack
函数。
tips:什么是静态绑定与动态绑定?
- **静态绑定**:在编译阶段就确定要调用的函数。编译器根据指针或引用的类型来决定调用哪个函数,而不是根据指针或引用实际指向的对象类型。
- **动态绑定**:在运行时根据指针或引用实际指向的对象类型来决定调用哪个函数。要实现动态绑定,被调用的函数必须是**虚函数