1.多态的实现
基类的指针或者引用;派生类对基类的虚函数进行重写(函数名,参数类型,返回值相同)。
虚函数重写时会有例外情况协变,虚函数的返回值可以不同,例如基类虚函数返回基类的指针或引用,派生类虚函数返回派生类的指针或引用。
2.析构函数的重写
析构函数可以是虚函数,并且在特定情况下必须声明为虚函数解决内存泄露问题。
基类的析构函数加了virtual关键字后,派生类的析构函数和基类的析构函数构成重写,虽然表面函数名不同,但是经过处理最后函数名都为destructor。
构造函数不能为虚函数,多态的机制依赖于虚函数表,虚函数表在对象构造时才完成建立。
3.final和override关键字
override关键字:用以显示表明派生类对基类的虚函数进行了重写,如果编译器检查没有重写则报错,是为了代码的维护,清晰设计意图;
final关键字:当类被声明为final时,该类不可被继承;当虚函数被声明为final时,该虚函数不能被重写,常用于继承链中某个中间类的约束。
4.重载,重定义,重写的对比
重载:同一作用域内(全局或类内),函数名相同,参数列表不同(数量,类型,顺序)构成重载;返回值可以不同,但仅返回值不同不构成重载;
重定义(隐藏):派生类定义了与基类名字相同,但参数列表不同的函数,隐藏了基类的函数;
重写:派生类对基类的虚函数进行重写,函数名,参数列表,返回值完全相同(除协变)是多态的关键步骤;
5.抽象类
拥有纯虚函数的类叫做抽象类,纯虚函数只在抽象类后边加上 = 0即可,抽象类不能例化对象,需要继承后重写虚函数后使用。
6.虚函数表指针
如果一个类有虚函数,那么里面至少有一个虚函数表指针,这个指针指向的地址存放一系列函数指针。