我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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"); }
};

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章主要介绍了C++成员函数后面加override问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

C++类成员函数后面加const问题

这篇文章主要介绍了C++类成员函数后面加const问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

C++ 友元函数如何访问私有成员?

c++++ 中友元函数访问私有成员的方法有两种:在类内声明友元函数。声明一个类作为友元类,该类中所有的成员函数都可以访问另一个类的私有成员。C++ 友元函数访问私有成员的方法友元函数是一种在类外部定义,但可以访问类私有成员的函数。有两种方
C++ 友元函数如何访问私有成员?
2024-04-15

C++ 静态函数可以访问非静态成员函数吗?

在 c++++ 中,静态函数不能直接访问非静态成员函数。解决方法包括:1. 通过对象指针访问;2. 通过类作用域运算符访问。C++ 中静态函数访问非静态成员函数在 C++ 中,静态函数是一种特殊的成员函数,它与类中的任何特定对象不关联。这
C++ 静态函数可以访问非静态成员函数吗?
2024-04-17

C++ 友元函数能访问哪些类型成员?

在 c++++ 中,友元函数可以访问类的所有公共、受保护和私有成员,但私有成员的访问受限,只能在类的成员函数调用时进行。C++ 友元函数可以访问哪些类型成员?什么是友元函数?友元函数是 C++ 中一种特殊的函数,它可以访问一个类的 pr
C++ 友元函数能访问哪些类型成员?
2024-04-15

C++ 成员函数详解:对象方法的虚继承与钻石问题

虚继承解决了多重继承中的“钻石问题”,其中一个类从两个或多个具有相同基类的子类继承时。通过在派生类的继承规范中使用 virtual 关键字,派生类不会获得基类的副本,而是通过指针间接访问基类的方法。这样,派生类只获得一个来自最终从基类派生的
C++ 成员函数详解:对象方法的虚继承与钻石问题
2024-04-29

C++ 静态函数可以访问非静态数据成员吗?

一般情况下,c++++ 静态函数不能访问非静态数据成员,但可以通过以下例外情况间接访问:指向非静态成员指针:静态函数可以拥有非静态数据成员的指针。接受非静态成员引用的参数:静态函数可以接受非常量成员引用作为参数。C++ 中静态函数是否可以访
C++ 静态函数可以访问非静态数据成员吗?
2024-04-16

C++ 友元函数详解:友元函数在访问私有成员时的限制?

友元函数可以访问私有成员,但受限制:只能访问当前类(不能访问继承类)的私有成员,且不能直接修改。实战中,友元函数可通过引用或指针访问私有成员,例如访问 student 类的私有成员 name 并打印学生信息。C++ 友元函数详解:访问私有成
C++ 友元函数详解:友元函数在访问私有成员时的限制?
2024-04-29

面向对象编程中的 C++ 函数声明:理解成员函数的特殊性

c++++ 中成员函数的特殊声明约定包括:显式指定所属类名,表明函数属于哪个类。隐式 this 指针,指向调用该函数的对象,允许访问对象数据成员和方法。面向对象编程中的 C++ 函数声明:理解成员函数的特殊性面向对象编程(OOP)是一种软
面向对象编程中的 C++ 函数声明:理解成员函数的特殊性
2024-05-04

JS实现页面加载完成之后自动刷新一次问题

这篇文章主要介绍了JS实现页面加载完成之后自动刷新一次问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录