多态:指相同对象收到不同消息或不同对象收到相同消息时产生不同的动作。
静态多态(早绑定):
相同对象收到不同消息产生不同的动作,其实就是函数重载。计算机编译时会自动找到相应的函数执行,所以称之为早绑定。
动态多态(晚绑定):
不同对象收到相同消息时产生不同的动作。例如求取计算机面积,两块区域圆和长方形,对这两个区域求取面积。动态多态通常使用继承,例如父类为shape类,在这个类中定义求取面积calcAera函数,子类为circle和rect类,全部公共继承shape类,然后调用calcAera函数求取面积。
但是注意需要在父类和子类的calcAera函数前面加上虚函数关键字virtual,子类中的calcAera函数也可以不加,系统会自动加上,但最好还是加上,养成良好的习惯。如果在父类calcAera函数前面没有加上virtual,子类调用的是父类的calcAera函数,完成的是父类calcAera函数中的功能,而不是自己的calcAera函数中的功能。
虚析构函数:
在析构函数前加virtual,保证内存不被泄露。
如果在circle类中定义了一个另一个类coordinate类的指针对象,并在构造函数中为其在堆中申请了一块内存m_pCenter=newcoordinate(3,5),在circle类的析构函数中释放了这块内存,并指向NULL。
例如:
shape *shape1=new rect(3,5);
shape *shape2=new circle(3);
shape1->calcAera();
shape2->calcAera();
delete shape1;
shape1=NULL;
delete shape2;
shape2=NULL;
如果未在父类及子类的析构函数前加上virtual的话,上面的例子只会调用父类的析构函数,以前子类的析构函数没有实质的作用,所以没有问题。但现在circle类中的析构函数需要释放那块在堆中申请的内存,所以需要调用circle类中的析构函数,这样的话,将会出现内存的泄露。如果在父类及子类的析构函数前加上virtual的话,父类和子类的析构函数都将会被调用,保证了内存不被泄露。
Virtual的限制:
1.Virtual不可加在构造函数前;
2.不能够加在普通函数前;
3.不能修饰静态成员函数。