C++ 多态、虚函数、虚析构函数
1.若某种语言只支持类但不支持多态,则只能称为基于对象,不能说是面向对象。
2.多态:向不同对象发送同一个消息,不同的对象会产生不同的行为,发送消息可以是调用函数等操作。函数重载、运算符重载都是多态。
3.多态分为静态和动态:
静态多态性:函数重载和运算符重载(实质也是函数重载),编译时就知道调用哪个函数;
动态多态性:编译时不知道调用哪个函数,运行时才知道,是要通过虚函数实现的。
4.虚函数:当父类指针指向子类时,只能调用子类中的父类部分,但是如果父类中的某个成员函数被声明为虚函数时,该指针就可以调用子类中的子类部分了。实际上也是先指向子类中的父类部分,但是因为子类中的父类部分已经被声明为虚函数,所以不会被调用,而是调用子类中被重写的父类虚函数,就是取而代之了。对于虚函数都是通过指针、引用来调用的,通过对象名调用的话不用虚函数。
5.一个成员函数被声明为虚函数时,其子类中的同名函数都自动成为虚函数,不用每层声明都加virtual,但一般每层声明都加!
6.父类中的非虚函数在子类中也可能被重新定义,如果使用父类指针调用就会调用父类的成员函数,如果使用子类指针调用就会调用子类的成员函数,这并不是多态,因为指针类型不同,跟虚函数无关。
7.虚析构函数:一定要给多态继承的父类加上虚析构函数,原因是如果不这么做会造成delete其父类指针时造成诡异的对象局部销毁,而对象的销毁不完全,就是造成内存泄漏的原因。
虚析构函数一般都跟new delete有关,
e.g. 父类:point,子类:circle,
point *p=new circle;
delete p;
此时只会执行point的析构函数,不会执行circle的析构函数,会内存泄漏。
若声明point的析构函数为虚函数,则delete p会先执行circle的析构函数,再执行point的析构函数。
8.纯虚函数:父类中完全用不到,子类中能用到的函数。
定义方式:virtual 函数类型 函数名(参数列表)=0;
//没有函数体!!!
//“=0”只是一种形式,没啥意义;
//只有名字,没有功能,不能被调用,只是为了给子类做准备。