C++中 多态和虚函数 随笔
C++作为面相对象编程语言,最主要的一个特征就是具有多态性。
什么是多态?我记得以前老师用一句话来概括,即是父类对象指针或者引用指向子类对象。
如何来理解这句话呢,首先存在父类与子类,那就一定牵扯到继承,也就是说继承是多态的基础。
其次父类对象指针为何要指向子类对象呢,原因就是需要调用子类对象的方法来实现函数。
然后再想,父类对象如何调用子类的方法呢,那就需要用到虚函数即父类中声明一个虚函数,在子类中重写这个函数,而当父类对象调用虚函数的时候即调用的是子类重写的那个方法。
这个实现过程即是多态!
有人把多态分为静态联编和动态联编,静态即所谓的编译时多态,也就是重载。何为重载,意思是在同一个作用域里,拥有相同函数名,但参数列表不同(包括参数类型,参数个数,参数顺序等)所以处理方法不同的函数或运算符。重载没有继承,也就谈不上多态。它是在编译的时候,系统会把函数名变成带有数据类型的名字,以区别函数。重载是一种语言特性。与多态无关,与面向对象也无关。
而说到动态,那就是重写了,也可以叫做覆盖。重写是涉及父子类的,即有继承关系。而且父类与子类的函数名相同,参数列表也相同。另外,重写是靠虚函数来实现的,即在父类中声明虚函数,然后在子类中重新编写这个函数,当实例化的父类对象指针指向子类对象时,对象调用函数实际是子类中重写的实现函数。
那这个过程是如何实现的呢,我们先来看下虚函数与虚函数表的关系。
当一个类中声明了一个虚函数的时候,编译器会生成一个对应的虚函数表,而当类实例化成一个对象的时候,这个表即被分配到了对象的内存中。而且编译器为了更方便的获取虚函数在内存中的偏移量,一般都是将虚函数表的指针存放在对象内存的最前面。前面说到了实现多态的方法就是把父类对象指针指向子类对象,此时子类对象中的虚函数表的首地址即为父类对象中虚函数表的首地址。也就是说父类对象得到了虚表地址,根据地址来调用相应的虚函数。
多态的意义在于其实现了接口重用,使程序更易于拓展,代码重用更加的方便,更具有灵活性。

浙公网安备 33010602011771号