C++ 面向对象核心:多态详解
一、多态的概念及实现
1. 什么是多态?
多态的核心在于'多种形态'。它是 C++ 面向对象编程最重要的特性之一,分为编译时多态(静态多态)和运行时多态(动态多态)。这里我们重点讨论运行时多态。
编译时多态主要涉及函数重载和模板,通过参数类型匹配在编译期决定调用哪个函数。之所以叫编译时多态,是因为实参传给形参的匹配是在编译阶段完成的。
运行时多态则更灵活:同一个行为(函数),传入不同的对象,执行不同的逻辑。比如买票这个行为,普通人全价,学生优惠,军人优先;再比如动物叫,猫是喵,狗是汪。这就是通过不同对象实现了同一接口的不同表现。
2. 虚函数
类成员函数前加 virtual 修饰,该函数即为虚函数。注意非成员函数不能加 virtual。
class Person {
public:
// 加上 virtual,BuyTicket 就是虚函数
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
虚函数的重写/覆盖
虚函数重写(Override)发生在派生类中,要求基类必须有被 virtual 修饰的虚函数。
重写是实现多态的关键。定义是:在派生类中提供一个与基类中某个虚函数具有完全相同函数名、参数列表、返回值类型的函数。
重写的目的是在运行时,当通过基类指针或引用指向派生类对象时,能够调用派生类的版本,而不是基类的版本。这就是'动态绑定'的基础。
// Person 类与 Student 类中的 buyticket 构成重写
class Person {
public:
virtual void buyticket() {
cout << "全价票" << endl;
}
};
class Student : public Person {
public:
virtual void buyticket() {
cout << "半价票" << endl;
}
};
需要注意一点:。因为子类继承基类后,基类的虚函数属性会被继承下来,在派生类依旧保持虚函数属性。不过这种写法不规范,不建议使用,但在考试选择题中常作为陷阱出现。


