C++成员函数后面加override问题

 更新时间:2022年11月05日 09:34:55   作者:方洪斌  
这篇文章主要介绍了C++成员函数后面加override问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

C++成员函数后面加override

class A
{
    virtual void foo();
}
class B :public A
{
   
    void foo() override; 
}

如果一个成员函数后面跟了一个override关键字,说明这个函数将重写这个函数,下面的方式也可以进行重写。

void foo(); 
virtual foo(); 

但是后面加override算是一种声明,此函数要重写同名函数,所以如果将函数的名字写错了比如写成f00则会报错,而下面的两个却不会,这样也可以提醒代码阅读者这是一个重写的函数。

override虚析构函数使用技巧

#include <cstdio>

class Base 
{
public:
    ~Base() { ::printf("base\n"); }
};

class Derived 
    : public Base 
{
public:
    ~Derived() { ::printf("derived\n"); }
};
Base *ptr = new Derived;
delete ptr;

由于父类析构函数不是虚函数,因此编译器只能找到父类析构函数,而无法通过续表找到子类析构函数,因此上例会造成内存泄漏,子类中的数据成员没法得到释放。最重要的是这种行为并不会被编译器察觉

因此effective c++建议,一个类一旦确认要被继承就应该在其析构函数前加上关键字virtual

因此得到下面的写法

#include <cstdio>

class Base
{
public:
    virtual ~Base() { ::printf("base\n"); }
};

class Derived 
    : public Base
{
public:
    ~Derived() { ::printf("derived\n"); }
};

如此,就不会出现多态下的内存泄漏问题。

但是!如果父类设计者忘记加关键字virtual,或者由于业务的需要,当前类必须被子类实现某些功能( interface-implement ),岂不是就会再次造成泄漏?

因此,作为子类的设计者,有义务提醒父类设计者,缺少关键字virtual,从而避免内存泄漏

C++11 新特性中的关键字override,编译器会检查基类中的虚函数和派生类中带有override的虚函数有没有相同的函数签名,一旦不匹配便会报错

因此子类设计者可以在其析构函数后增加关键字override,一旦父类缺少关键字virtual就会被编译器发现并报错

#include <cstdio>

class Base
{
public:
    virtual ~Base() { ::printf("base\n"); }
};

class Derived 
    : public Base
{
public:
    ~Derived() override { ::printf("derived\n"); }
};

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于linux下获取时间函数的详解

    基于linux下获取时间函数的详解

    本篇文章是对linux下获取时间的函数进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • QT实现将两个时间相加的算法[hh: mm + hh: mm]的示例代码

    QT实现将两个时间相加的算法[hh: mm + hh: mm]的示例代码

    本文主要介绍了QT实现将两个时间相加的算法[hh: mm + hh: mm]的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C++常用字符串函数大全(2)

    C++常用字符串函数大全(2)

    这篇文章主要给大家分享的是C++常用字符串函数的大全,cstring.h库即C语言中的string.h库,它是C语言中为字符串提供的标准库。C++对此进行了兼容,所以我们在C++当中一样可以使用,下面文章的详细内容,需要的朋友可以参考一下
    2021-11-11
  • 详解C语言之缓冲区溢出

    详解C语言之缓冲区溢出

    缓冲区是一块连续的计算机内存区域,可保存相同数据类型的多个实例。缓冲区可以是堆栈、堆和静态数据区。在C/C++语言中,通常使用字符数组和malloc/new实现缓冲区。溢出指数据被添加到分配给该缓冲区的内存块之外。缓冲区溢出是最常见的程序缺陷
    2021-06-06
  • 从汇编看c++中引用与指针的使用分析

    从汇编看c++中引用与指针的使用分析

    在c++中,引用和指针具有相同的作用,都可以用来在函数里面给变函数外面对象或者变量的值,下面就来看他们的原理
    2013-05-05
  • 一道面试题教你轻松玩转C++指针

    一道面试题教你轻松玩转C++指针

    下面小编就为大家带来一篇深入理解c++指针的指针和指针的引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧
    2021-09-09
  • 使用C语言判断当前存储大小端问题

    使用C语言判断当前存储大小端问题

    这篇文章主要介绍了如何使用C语言判断当前存储大小端问题,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • 基于C语言模拟实现人生重开模拟器游戏

    基于C语言模拟实现人生重开模拟器游戏

    人生重开模拟器是前段时间非常火的一个小游戏,所以本文我们将一起学习使用c语言写一个简易版的人生重开模拟器,感兴趣的小伙伴可以了解下
    2024-02-02
  • C++ sleep()和usleep()的区别

    C++ sleep()和usleep()的区别

    本文主要介绍了C++ sleep()和usleep()的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Visual Studio Code安装和配置的教程

    Visual Studio Code安装和配置的教程

    这篇文章主要介绍了Visual Studio Code安装和配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论