虚函数、纯虚函数、多态与析构函数

版权声明:此文章有作者原创,涉及相关版本问题可以联系作者,[email protected] https://blog.csdn.net/weixin_42600072/article/details/88672327

虚函数

只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数。因为虚函数的作用是允许在派生类中对基类的虚函数重新定义。所以虚函数只能用于类的继承层次结构中。
虚函数是C++中用于实现多态的机制。核心理念就是通过基类指针访问派生类中定义的函数。虚函数允许子类重新定义成员函数,继承时不重新定义虚函数也是可以的。而子类重新定义父类的做法称为覆盖(override),或者称为重写。如果父类或者祖先类中函数func()为虚函数,则子类及后代类中,函数func()是否加virtual关键字,都将是虚函数。
虚函数实现机制
基类的指针执行到相应的代码处时,能确定指针指向的是哪一个对象,从而调用相应的虚函数指针vptr,找到相应虚函数表中的相应虚函数。

纯虚函数

基类中的虚函数是为了派生类中的使用而声明定义的,其在基类中没有任何意义。此类函数我们叫做纯虚函数,不需要写成空函数的形式,只需要声明成:
virtual 函数类型 函数名(形参表列)=0;
注意:纯虚函数没有函数体;
纯虚函数只有函数的名字但不具备函数的功能,不能被调用。在派生类中对此函数提供定义后,才能具备函数的功能,可以被调用

析构函数

析构函数的作用是在对象撤销之前把类的对象从内存中撤销。通常系统只会执行基类的析构函数,不执行派生类的析构函数。
只需要把基类的析构函数声明为虚函数,即虚析构函数,这样当撤销基类对象的同时也撤销派生类的对象,这个过程是动态关联完成的。

  1. 当存在类继承并且析构函数中有必须要进行的操作时(如需要释放某些资源,或执行特定的函数)析构函数需要是虚函数,否则若使用父类指针指向子类对象,在delete时只会调用父类的析构函数,而不能调用子类的析构函数,从而造成内存泄露或达不到预期结果;
  2. 虚函数能不能是内联函数要取决于具体情况:虚函数是通过基类的对象调用的就可以内联,如果虚函数是通过基类指针指向的子类对象,这个时候是要多态调用,不能在编译期间确定内联,所以是不能内联的。其实inline都只是一个申请,最终由编译器决定内联还是不内联。
  3. 构造函数不能为虚函数:构造函数在进行调用时还不存在父类和子类的概念,父类只会调用父类的构造函数,子类调用子类的,因此不存在动态绑定的概念;但是构造函数中可以调用虚函数,不过并没有动态效果,只会调用本类中的对应函数;
  4. 静态成员函数不能为虚函数:静态成员函数是以类为单位的函数,与具体对象无关,虚函数是与对象动态绑定的。
    参考链接:https://blog.csdn.net/leigelaile1/article/details/80430822

猜你喜欢

转载自blog.csdn.net/weixin_42600072/article/details/88672327