C++ 多态详解:虚函数、重写与底层原理
多态分为编译时多态(静态)和运行时多态(动态)。编译时多态主要体现为函数重载和模板,而运行时多态则是我们面试和开发中的重点。简单来说,运行时多态是指通过基类的指针或引用调用同一个函数,根据实际指向的对象类型不同,执行不同的行为。
多态的定义及实现条件
多态通常发生在继承体系下。要实现运行时多态,必须满足两个核心条件:
- 必须有继承关系:派生类继承自基类。
- 必须使用虚函数:被调用的函数在基类中声明为
virtual,且派生类完成了重写(Override)。
只有当基类指针或引用指向派生类对象,并调用该虚函数时,多态才会生效。
虚函数基础
在类成员函数前加上 virtual 关键字修饰,该函数即为虚函数。注意,非成员函数不能加 virtual 修饰。
class Person {
public:
virtual void BuyTicket() {
std::cout << "买票 - 全价" << std::endl;
}
};
虚函数的重写
如果派生类中存在一个与基类虚函数签名完全相同的函数(返回值类型、函数名、参数列表一致),则称派生类重写了基类的虚函数。即使派生类没有显式添加 virtual 关键字,只要继承了基类的虚函数并重写,依然构成重写,但为了代码清晰,建议显式写出。
namespace twg {
class Person {
public:
virtual void BuyTicket() {
std::cout << "买票 - 全价" << std::endl;
}
};
class Student : public Person {
public:
virtual void BuyTicket() {
std::cout << "买票 - 打折" << std::endl;
}
};
class Animal {
public:
virtual {}
};
: Animal {
:
{
std::cout << << std::endl;
}
};
: Animal {
:
{
std::cout << << std::endl;
}
};
{
animal.();
}
}
{
twg::Cat cat;
twg::Dog dog;
twg::(cat);
twg::(dog);
;
}


