C++面向对象编程核心特性:多态
一、多态的概念及实现
1、什么是多态?
多态顾名思义就是有多种形态。多态是C++面向对象编程的最重要的特性之一,多态分为:编译时多态 (静态多态) 和运行时多态 (动态多态),这里我们重点讲运行时多态。编译时多态 (静态多态) 主要就是我们前面讲的函数重载和函数模板,它们传不同类型的参数就可以调用不同的函数,通过不同的参数类型来达到多种形态。而之所以叫编译时多态,是因为它们实参传给形参的参数匹配是在编译时完成的,我们把编译时一般归为静态,运行时归为动态。
运行时多态,具体点讲就是去完成某个行为 (函数),可以传不同的对象来完成不同的行为,就达到了多种形态。比如买票这个行为,当对象是普通人时,是全价买票;对象是学生买时,是优惠买票 (5折或75折);当对象是军人时,是优先买票。再比如,同样是动物叫的一个行为 (函数),传猫对象过去,就是喵,传狗对象过去,就是汪汪。
2、虚函数
类成员函数前面加 virtual 修饰,那么这个成员函数被称为虚函数。注意非成员函数不能加 virtual 修饰。
class Person {
public:
// 这里在成员函数 BuyTicket 前面加了 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;
}
};


