多态是一种运行期绑定机制,通过这种机制,实现将函数名绑定到函数具体实现代码的目的。 一个函数在内存当中起始的地址就称为这个函数的入口地址。
多态就是将函数名称动态地绑定到函数入口地址的运行期绑定机制。
C++中的运行期绑定与编译期绑定
一个函数的名称与其入口地址是紧密相连的,入口地址是函数在内存当中的起始地址。
#include <iostream>
usingnamespace std;
void sayHi();
int main() {
sayHi();
return 0;
}
void sayHi() {
cout<<“Hello,wonderful world!”<<endl;
}
编译期绑定是函数需要执行的代码由编译器在编译阶段确定了的。也就是说将某个函数名和其入口地址进行绑定在一起。
运行期绑定是直到程序运行之时(不是在编译时刻),才将函数名称绑定到其入口地址。
如果对一个函数的绑定发生在运行时刻而非编译时刻,我们就称该函数是多态的。
注意的几点:
虚成员函数继承
和普通成员函数一样,在派生类中虚成员函数也可以从基类继承。
运行期绑定和虚成员函数表
C++是使用vtable(虚成员函数表)来实现虚成员函数的运行期绑定。
使用动态绑定的程序会影响效率,因为虚成员函数需要额外的存储空间,而且对虚成员函数表进行查询也需要额外的时间。
重载
重载函数和虚函数的区别在于前者是编译期绑定的,后者是运行期绑定
抽象基类和纯虚成员函数
抽象基类不能被实例化,其可以用来指明某些必须被派生类覆盖的虚函数,这样就可以让一些类具有共同的接口,它们都是继承于某个抽象基类的。
class Abstract
{
pulbic:
virtual void open() = 0;
};
定义纯虚成员函数的限制
只有虚函数才可以成为纯虚成员函数,非虚函数或顶层函数都不能声明为纯虚成员函数。