小结
什么是多态?
简单说来,多态就是一种接口,多种方法。
多态分为编译期多态和运行期多态。编译器多态是指在编译期确定调用的函数,也称为静态绑定。运行期多态是指在运行期确定调用的函数,也称为动态绑定。
编译期多态使用宏、重载、模板实现,运行期多态使用虚函数、虚空指针(void*)实现。
void*指针可以称为多态,也可以不视作多态。
虚函数实现原理?
定义虚函数的基类及其派生类各自都有一个虚表,而类对象都有一个虚指针,指向与类对应的虚表。当然,先构造基类,再构造派生类,先析构派生类,再析构基类。在构造基类和析构基类之时,派生类成员变量处于未定义状态,虚指针指向基类的虚表,在构造函数和析构函数调用虚函数,结果调用的是基类的虚函数,并不是派生类的虚函数。
纯虚函数和虚函数的区别,什么时候使用纯虚函数?
纯虚函数不一定有定义,而虚函数必有定义。
纯虚函数声明如下:
virtual type function() = 0;
虚函数声明如下:
virtual type function();
在定义并不能够实例化的抽象类之时使用纯虚函数,抽象类是为抽象和设计而建立的特殊类,存在于类继承树结构的上层。
重载、重写、重定义
重载(overload):在同一作用域之内,函数名称相同,参数的类型、数量或者顺序任一不同。
重写(override):派生类定义的函数与基类作用域的虚函数具有相同名称和相同参数列表。
重定义:派生类重定义与基类相同名称的函数,重定义包括覆盖和隐藏。
覆盖与隐藏的区别(重定义的两种情况)
作用域名称可视性
派生类定义的函数与基类作用域的函数具有相同名称和相同参数列表(包括虚函数),基类相同签名的函数被覆盖
派生类定义的函数与基类作用域的函数具有相同名称和不同参数列表(包括虚函数),基类相同名称的函数被隐藏
有感而发
看似简单的问题,其实我还是需要深入了解不能停留在表层,加油吧