什么是多态?
多态是C++面向对象编程中的一个核心概念,它允许程序在执行过程中,根据对象的实际类型来调用适当的函数。多态性主要通过继承和虚函数来实现,这使得代码更加灵活和可扩展。多态的条件如下:1、调用函数是重写的虚函数。2、基类指针或者引用。
虚函数的概念
被virtual修饰的成员函数就是虚函数。
虚函数的重写
虚函数重写是指派生类重新定义(或称为覆盖)了基类中的虚函数。当派生类中存在一个与基类中虚函数具有三同,即相同名称、参数列表和 返回值(在C++11及以后版本中,还包括const属性和volatile属性)的函数时,该函数就重写了基类中的虚函数。
下面通过一个代码样例来简单看一看
在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样写。
协变是虚函数重写的一个特例。协变是指派生类重写虚函数时,与基类虚函数返回值类型不同。但是基类虚函数返回值类型是基类的指针或引用。派生类虚函数的返回值类型是派生类的指针或引用。
析构函数的重写也是一个特殊的例子。如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写。虽然函数名不相同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor。
为什么需要重写虚函数呢?通过下面场景便可以明白。
可以看到在释放Student的切片时,编译器没有去调用派生类的析构函数释放派生类对象部分,这导致了内存泄露问题。因为delete底层是会去让p对象去调用它的析构函数,然后调用operator delete来释放空间。在这个场景中用户期望调用析构函数的行为是一个多态调用。所以,我们需要重写析构函数以达到正常释放派生类对象的目的。
C++11标准提供了两个关键字,override 和 f