一、多态
概念
多态,就是多种状态,即不同的对象去完成同一个行为时会产生出不同的状态。比如:买票时,成人要原价买,学生和老人就可以享受优惠价便宜一点儿。同样是买票这个行为,不同的对象来做就有不同的状态,这就是多态的一种体现。
从代码实现上来说,多态指的是通过一个父类指针 or引用调用一个虚函数时,会根据具体对象的类型来调用该虚函数的不同实现。在多态中,相同的操作可以作用于不同的对象,而具体执行的操作则取决于对不同对象的类型判断。(“看人下菜碟🤪”)
那怎么构成多态呢?有两个条件:
1.子类重写父类的虚函数
2.通过父类的指针或引用去调用虚函数
估计你现在是一头雾水:啥是虚函数?啥是重写?多态到底是怎么用的?
不急,你现在对多态的概念一定还是一片混沌。下面我先讲解“虚函数”、“重写”的概念,然后举出多态的代码实例,你才能体会什么是多态。看到后面,再回过头来看多态的概念,会有更透彻的理解。
虚函数
先来学习一个知识点“虚函数”,注意,和菱形继承那里的 虚继承 是两个完全不同的概念!它俩的关系就是金鱼和自行车之间的关系。
🎈虚函数:被virtual修饰的类成员函数称为虚函数。
虚函数必须是非静态的成员函数,非成员函数和静态函数是无法成为虚函数的。
class Person {
public:
virtual void BuyTicket() { …… }
};
虚函数的作用是:实现多态机制。
重写(覆盖)
若子类定义了一个和父类的虚函数 一模一样的虚函数,那么称子类中的虚函数重写 / 覆盖了父类的虚函数。(拥有相同的名字、返回值、形参列表)
重写是针对虚函数的概念。普通函数是没有重写的说法的。
例:
class Person
{
public:
virtual void BuyTicket() {
cout << "成人票10r" << endl;
}
};
class Student:public Person
{
public:
virtual void BuyTicket() { //子类中的虚函数重写了父类的虚函数
cout << "学生票5r" << endl;
}
};
其实,在重写基类虚函数时,派生类的虚函数即使 不加virtual关键字,也是可以构成重写的。
这是因为,继承后基类的虚函数被继承下来了,在派生类依旧保持虚函数属性。
但是该种写法不规范,不建议这样使用。我们还是老老实实加上virtual吧。