C++ 多态详解:虚函数、虚表与动态绑定机制
多态分为编译时多态(静态)和运行时多态(动态)。编译时多态主要涉及函数重载和模板,而运行时多态则是我们讨论的重点。
1. 多态的概念
运行时多态指的是同一个行为接口,传入不同的对象实例,会执行不同的具体实现。比如买票这个行为,普通人是全价,学生是优惠,军人优先;再比如动物叫,猫对象调用就是'喵',狗对象调用就是'汪汪'。

2. 多态的定义及实现条件
多态通常发生在继承关系下,基类指针或引用调用虚函数时产生不同行为。要实现运行时多态,必须满足两个核心条件:
- 必须有继承关系:且通过基类的指针或引用来调用函数。
- 被调用的函数必须是虚函数,并且派生类完成了重写(Override)。
2.1 虚函数
在类成员函数前加 virtual 修饰,该函数即为虚函数。非成员函数不能加此修饰符。
class Person {
public:
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
2.2 虚函数的重写
派生类中有一个与基类完全相同的虚函数(返回值类型、函数名、参数列表均相同),称为重写了基类虚函数。注意,即使派生类未加 virtual 关键字,只要签名一致,依然构成重写,但为了代码清晰,建议显式加上。
namespace twg {
class Person {
public:
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
class Student : public Person {
public:
virtual void BuyTicket() {
cout << "买票 - 打折" << endl;
}
};
{
:
{}
};
: Animal {
:
{
std::cout << << std::endl;
}
};
: Animal {
:
{
std::cout << << std::endl;
}
};
{
animal.();
}
}
{
twg::Cat cat;
twg::Dog dog;
twg::(cat);
twg::(dog);
;
}


