封装,继承,多态不只是C++的三大特性,而是面向对象编程的三大特性。
什么是多态:
不同的对象做同一件事情,结果会出现多种形态。
1.满足多态的几个条件
1.父子类完成虚函数重写(需要满足三同:函数名,参数,返回值都需要相同)。
2.父类的指针或引用去调用虚函数。(指向谁就调用谁的虚函数)
既然有了父类和子类,那么说明多态发生的前提是继承。
例子:
不同身份的人买票的价格是不同的。
但如果不满足多态的条件,就达不到我们想要的结果:
2.多态的坑
2.1虚函数重写的两个例外
强调一下:
1.返回值只能是父类返回父类的指针或引用,子类返回子类的指针或引用,顺序不能反过来。
2.返回值可以是其他不相关的父子类,也可以是自己的父子类。
关于析构函数的重写
如果我们正常的写析构函数,看看它们调用的情况:
可见,两次析构都调用的是基类的,这是正常现象,两个Person的指针自然调用Person的析构。但这并不是我们的目的,我们想要的是指针指向谁就应该调用谁的析构,也就是说:我们想让P2调用Student的析构,只有这样才满足多态的规则。
但如果我们用virtual修饰这两个析构函数呢: