C++基础之重载,重写和隐藏(十八)

news2024/12/27 12:53:47

一.重载

定义:发生在统一作用域中,函数名称相同,但是参数列表不同(包括参数的个数,参数类型,参数顺序)。

#include <iostream>

using std::cout;
using std::endl;

int add(int a,int b)
{
    cout<<"this is int add(int a,int b)"<<endl;
    return a+b;
}

double add(double a, double b)
{
    cout<<"this is double add(double a, double b)"<<endl;
    return a+b;
}

int add(int a,int b,int c)
{
    cout<<"this is int add(int a,int b,int c)"<<endl;
    return a+b+c;
}

int main()
{
    int a=1,b=2,c=3;
    cout<<"int add(int a,int b) = "<<add(a,b)<<endl;
    cout<<"int add(int a,int b,int c) = "<<add(a,b,c)<<endl;

    double aa=1.2,bb=2.2;
    cout<<"double add(double a, double b) = "<<add(aa,bb)<<endl;


}

二.重写(覆盖)

定义:发生在基类与派生类中,必须是虚函数,函数名相同,参数列表也相同。可以通过override关键字判断是否是重写函数。

#include <iostream>

using std::endl;
using std::cout;

class Base
{
private:
    int _ix;
public:
    Base(int x=0)
    :_ix(x)
    {
        cout<<"Base(int x=0)"<<endl;
    }
    ~Base()
    {
        cout<<"~Base()"<<endl;
    }
    virtual
    void print()const
    {
        cout<<"Base::_ix = "<<_ix<<endl;
    }
};

class Derived
:public Base
{
private:
    int _iy;
public:
    Derived(int x=0,int y=0)
    :Base(x)
    ,_iy(y)
    {
        cout<<"Derived(int x=0,int y=0)"<<endl;
    }
    ~Derived()
    {
        cout<<"~Derived()"<<endl;
    }
    //经过继承下来此时print也是虚函数
    void print()const
    {
        cout<<"Derived:: _iy = "<<_iy<<endl;
    }

};
void func(Base* base)
{
    base->print();
}
void test()
{
    Base base(3);
    Derived derived(33,44);

    //同一个指令根据
    func(&base);
    func((Base*)&derived);
    func(&derived);  
}
int main()
{
    test();
    return 0;
}

如果加了override表示这个函数是继承基类的虚函数并且重写了基类的函数,因为重写时要保证函数名,函数类型,函数参数要完全相同,如果不同就会报错。

三.隐藏

定义:发生在基类与派生类中,派生类中的函数与基类的函数名字相同。(至于是不是虚函数,参数列表相不相同都没有关系),在派生类中会隐藏基类的同名函数和数据成员。

#include <iostream>
#include <string.h>
#include <stdio.h>
using std::cout;
using std::endl;

class Base
{
public:
    char* _str;
    Base(const char* str)
    :_str(new char[strlen(str)+1]())
    {
        strcpy(_str,str);
        cout<<"Base(const char* str)"<<endl;
    }
    virtual
    ~Base()
    {
        cout<<"~Base()"<<endl;
        if(_str)
        {
            delete[]_str;
            _str=nullptr;
        }
    }

    void print() const
    {
        printf("Base::_str = %s\n",_str);
    }
};

class Derived
:public Base
{
private:
    char* _str;

public:
    Derived(const char* str,const char* str1)
    :Base(str)
    ,_str(new char[strlen(str1)+1]())
    {
        strcpy(_str,str1);
        cout<<"Derived(const char* str,const char* str1)"<<endl;
    }

    ~Derived()
    {
        cout<<"~Derived()"<<endl;
        if(_str)
        {
            delete[]_str;
            _str=nullptr;
        }
    }

    void print() const
    {
        printf("Derived::_str = %s\n",_str);
        //同名的数据成员也会被隐藏,如果要找到基类的数据成员需要特指加上作用域限定符
        printf("Derived::Base::_str = %s\n",Base::_str);

    }


};
int main()
{
    Derived derived("基类","派生类");
    derived.print();
    //如果想要打印基类只能加上作用域限定符
    derived.Base::print();

}

可以看出在继承时派生类会对基类的同名数据成员和成员函数进行隐藏,这也很好理解,如果没有隐藏就会有多个同名函数,这些同名函数可以完全相同这就使得无法区分,所以可以在派生类对象调用成员函数时将继承来的成员函数隐藏,防止出现二义性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1552124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Diffusers库】第四篇 训练一个扩散模型(Unconditional)

目录 写在前面的话下载数据模型配置文件加载数据创建一个UNet2DModel创建一个调度器训练模型完整版代码&#xff1a; 写在前面的话 这是我们研发的用于 消费决策的AI助理 &#xff0c;我们会持续优化&#xff0c;欢迎体验与反馈。微信扫描二维码&#xff0c;添加即可。   官方…

2024通信展会|中国国际信息通信展览会|北京通信展

2024通信展会|中国国际信息通信展览会|北京通信展 2024年中国信息通信展将于2024年9月25-27日在北京.国家会议中心举办&#xff0c;展会将为我们带来无尽的惊喜和机遇。让我们一起期待这场盛大的科技盛会&#xff01; 2024年中国国际信息通信展览会&#xff08;简称&#xff1…

【分类评估指标,精确率,召回率,】from sklearn.metrics import classification_report

from&#xff1a; https://zhuanlan.zhihu.com/p/368196647 多分类 from sklearn.metrics import classification_report y_true [0, 1, 2, 2, 2] y_pred [0, 0, 2, 2, 1] target_names [class 0, class 1, class 2] # print(classification_report(y_true, y_pred, targe…

基于Transformer的医学图像分类研究

医学图像分类目前面临的挑战 医学图像分类需要研究人员同时具备医学图像分析和数字图像的知识背景。由于图像尺度、数据格式和数据类别分布的影响&#xff0c;现有的模型方法&#xff0c;如传统的机器学习的识别方法和基于深度卷积神经网络的方法&#xff0c;取得的识别准确度…

linux 环境安装配置

安装java17 1.下载安装包 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.解压到自定义目录/usr/local/java mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3.配置环境变量 echo export PATH$PATH:/…

Ansible-1

Ansible是一款自动化运维、批量管理服务器的工具&#xff0c;批量系统配置、程序部署、运行命令等功能。基于Python开发&#xff0c;基于ssh进行管理&#xff0c;不需要在被管理端安装任何软件。Ansible在管理远程主机的时候&#xff0c;只有是通过各种模块进行操作的。 需要关…

指针数组的有趣程序【C语言】

文章目录 指针数组的有趣程序指针数组是什么&#xff1f;指针数组的魅力指针数组的应用示例&#xff1a;命令行计算器有趣的颜色打印 结语 指针数组的有趣程序 在C语言的世界里&#xff0c;指针是一种强大的工具&#xff0c;它不仅能够指向变量&#xff0c;还能指向数组&#…

OpenHarmony实战开发-List组件的使用之设置项

介绍 在本篇CodeLab中&#xff0c;我们将使用List组件、Toggle组件以及Router接口&#xff0c;实现一个简单的设置页&#xff0c;点击将跳转到对应的详细设置页面。效果图如下&#xff1a; 相关概念 CustomDialog&#xff1a;CustomDialog装饰器用于装饰自定义弹窗。List&…

支付系统就该这么设计,稳的一批!!

Part one 支付系统总览 核心系统交互 业务图谱 Part two 核心系统解析 交易核心 支付核心 渠道网关 资金核算 Part three 服务治理 平台统一上下文 数据一致性治理 DB拆分 异步化 Part four 生产实践 性能压测 稳定性治理 核心链路分离 服务依赖降级 前言 支付永…

2024.3.21|华北水利水电大学江淮校区ACM社团训练赛

2024.3.21|华北水利水电大学江淮校区ACM社团训练赛 1.数字拆解 2.矩阵修改 3.因子数 4.回文数 5.中位数 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴…

敏捷BI看永洪科技,连续六届BI商业智能第一名

敏捷性对BI商业智能的重要性不言而喻。在一个快速变化的商业环境中&#xff0c;企业需要敏锐的洞察力和及时的反应能力来应对不断涌现的挑战和机遇。敏捷BI的核心理念是在保持质量的前提下&#xff0c;以快速、灵活、创新的方式获取、分析和利用数据&#xff0c;为企业决策提供…

并发编程之Callable方法的详细解析(带小案例)

Callable &#xff08;第三种线程实现方式&#xff09; Callable与Runnable的区别 Callable与Runnable的区别 实现方法名称不一样 有返回值 抛出了异常 ​class Thread1 implements Runnable{Overridepublic void run() { ​} } ​ class Thread2 implements Callable<…

【数学符合】

数学符合 ■ ∑ ■ ∑

中国国际通信大会2024|中国通信展览会|通信展览会

中国国际通信大会2024|中国通信展览会|通信展览会 中国国际信息通信展览会&#xff08;ICT展&#xff09;是亚太地区最具影响力的信息通信技术盛会之一。每年一度的ICT展汇聚了来自全球各行各业的专业人士&#xff0c;为各领域的科技公司、创新企业以及技术爱好者们提供一个难得…

Aurora插件安装

介绍 Latext是一种基于TEX的排版系统。 CTeX中文套装是基于Windows下的MiKTeX系统&#xff0c;集成了编辑器WinEdt和PostScrip处理软件Ghostscript和GSview等主要工具。CTeX中文套装在MikTeX的基础上增加了对中文的完整支持。 CTeX&#xff1a; CTeX套装 - CTEX 下载安装 然后…

libVLC 捕获鼠标、键盘事件

在实现播放器的时候&#xff0c;我们需要捕获键盘、鼠标事件进行视频快进、快退&#xff0c;或者双击全屏/退出全屏窗口、鼠标右键弹出菜单栏。默认情况下&#xff0c;在使用libVLC库的时候&#xff0c;我们无法捕获这些事件&#xff0c;因为我们将Qt的视频窗口传递给了libVLC。…

游泳防水耳机什么牌子好?内行人精选4个精品,不入后悔!

游泳是我们生活中一项非常重要的运动&#xff0c;它不仅可以锻炼我们的身体&#xff0c;还可以让我们放松心情。然而&#xff0c;在水下听音乐或接受指导&#xff0c;常常因为防水问题而变得困难重重。为了让大家在游泳时也能享受到美妙的音乐或者清晰的语音指导&#xff0c;我…

16.JRE和JDK

程序员在编写代码的时候其实是需要一些环境&#xff0c;例如我们之前写的HelloWorld。我们需要的东西有JVM、核心类库、开发工具。 1、JVM&#xff08;Java Virtual Machine&#xff09;&#xff1a;Java虚拟机&#xff0c;真正运行Java程序的地方。没有虚拟机&#xff0c;代码…

Spark-Scala语言实战(6)

在之前的文章中&#xff0c;我们学习了如何在scala中定义与使用类和对象&#xff0c;并做了几道例题。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-S…

springboot+mybatis快速搭建入门项目

简介 本文介绍了如何使用idea搭建一个简易springboot后端项目&#xff0c;该项目可以接受前端http请求&#xff0c;经由服务端并访问数据库&#xff0c;最后返回查询结果。该简易项目从零开始搭建&#xff0c;涵盖controller/service/dao层&#xff0c;简单易懂易上手&#xf…