1.多态的概念
由虚函数实现的动态多态性就是:同一类族中不同类的对象,对同一函数调用作出不同的响应。
先看下面这个简单的例子:
#include<iostream> using std::cout; using std::endl; class A { public: void print(){cout << "I am A's print" << endl;} }; class B : public A { public: void print(){cout << "I am B's print" << endl;} }; int main() { A a; B b; A *ap; ap = &a; ap->print(); ap = &b; ap->print(); }
运行结果是
I am A's print
I am A's print
说明指向派生类对象的基类指针无法调用派生类中的同名函数,而如果在A中print()函数前面加一个virtual,声明为虚函数,那么运行结果就变成
I am A's print
I am B's print
虚函数使我们能用指向派生类对象的基类指针去调用派生类中的同名函数,简单来说,这就是多态。
2.多态的意义
在面向对象的程序设计中,我们经常用到继承,而从基类继承的一些成员函数不符合派生类的需要,因此在派生类中要重写这些函数,为了方便仍使用相同的名字,于是有了同名函数的覆盖。
在多层次的派生关系中,要调用各层次的同名函数,就得定义多个指向各个派生类对象的相应派生类指针,例如上面要调用B类的print(),就声明一个B类的指针,然后指向b,再调用print(),或者直接用b对象来调用。当派生类层次多的时候,这都是很麻烦的方法并且不统一。
而虚函数的存在就使我们能够用同一种方式去调用同一类族中不同类的所有的同名函数,通过指向派生类的基类指针来调用相应的派生类的同名函数,这就是虚函数的意义。
3.多态的实现原理
暂时懒得去理解。。。