c++ 多态、虚函数、虚析构函数

来源:互联网 发布:怎样上淘宝网买东西 编辑:程序博客网 时间:2024/05/16 05:52

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”只是一种形式,没啥意义;

//只有名字,没有功能,不能被调用,只是为了给子类做准备。

原创粉丝点击