1、什么是多态
多态性可以简单概括为“一个接口,多种行为”。
也就是说,向不同的对象发送同一个消息, 不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。这是一种泛型技术,即用相同的代码实现不同的动作。这体现了面向对象编程的优越性。
多态分为两种:
(1)编译时多态:主要通过函数的重载和模板来实现。(静态联编)
(2)运行时多态:主要通过虚函数来实现。(动态联编)
2、几个相关概念
(1)覆盖、重写(override)
override指基类的某个成员函数为虚函数,派生类又定义一成员函数,除函数体的其余部分都与基类的成员函数相同。注意,如果只是函数名相同,形参或返回类型不同的话,就不能称为override,而是hide。
(2)重载(overload)
指同一个作用域出生多个函数名相同,但是形参不同的函数。编译器在编译的时候,通过实参的个数和类型,选择最终调用的函数。
(3)隐藏(hide)
分为两种:
1)局部变量或者函数隐藏了全局变量或者函数
2)派生类拥有和基类同名的成员函数或成员变量。
产生的结果:使全局或基类的变量、函数不可见。
我们先讲结论:
(1)每一个含有虚函数的类,都会生成虚表(virtual table)。这个表,记录了对象的动态类型,决定了执行此对象的虚成员函数的时候,真正执行的那一个成员函数。
(2)对于有多个基类的类对象,会有多个虚表,每一个基类对应一个虚表,同时,虚表的顺序和继承时的顺序相同。
(3)在每一个类对象所占用的内存中,虚指针位于最前边,每个虚指针指向对应的虚表。