面试中每次问到这个东西,我都说的很不好,感觉还是把它重新整理一下吧。
多态:是c++oop思想的三大特性之一。可提高代码的复用,和对功能的扩展。实现了,当一个函数被不同的对象调用时,能产生不同的效果或行为。c++的多态分为静多态和动多态,静多态是编译时的多态,即在编译时确定调用的是哪个函数,如模板、重载;动多态是运行时的多态,只有在运行的时候才能知道调用的是哪个函数,它是基于继承和虚函数来实现的。
具体说一下动多态:
当一个类中存在虚函数时,这个类中就会有一个虚函数指针指向一个保存了虚函数的虚函数表。子类继承父类时,会直接拷贝一份父类的虚函数表,如果子类不去改写父类的虚函数时,子类的虚函数表中的虚函数就是父类的虚函数,但当子类自己写了同名的函数,则子类自己的虚函数就会覆盖虚函数表中同名的父类虚函数,变成自己的虚函数。
另外,要定义为虚函数必须要有以下的两个条件:对象和地址。只有有了对象才会有虚函数指针,有了地址才能向虚函数表中存放。
基于这两个条件:和构造函数不可以定义为虚函数,因为构造函数结束后才会有对象;而析构函数可以,同时也建议将有继承关系的父类的析构函数定义为虚函数,原因为:如果不定义为虚函数,那么当一个父类的指针指向子类的对象时,在进行析构时,指针会直接调用父类的析构函数,而子类的对象是没有被析构的,所以把父类的析构函数定义为虚函数,就可以在父类指针指向子类对象时,能成功调用子类自己的函数析构掉子类对象。