首页 > 其他分享 >重载、覆盖、隐藏

重载、覆盖、隐藏

时间:2023-06-18 23:45:19浏览次数:44  
标签:函数 覆盖 同名 基类 重载 隐藏

C++类层次中的同名函数,有三种关系:

1.重载****(overload)
概念:相同的范围(同一个类)中的同名函数参数列表不同。
1)与返回值类型没有关系。
2)const是有效的重载。
3)virutal是无效的重载。virtual关键字可有可无,不影响是否是重载函数。

2.重写、覆盖****(override)
概念:在派生类中覆盖基类中的同名函数,要求
1)基类函数必须是虚函数
2)与基类的虚函数有相同的参数列表
3)与基类的虚函数有相同的返回类型、或者满足赋值兼容规则的指针/引用类型返回值(见下面的例子)。

以下情况不能实现多态:同名函数缺省参数不一致、同名函数用const修饰

3.隐藏****(hide,oversee)
概念:隐藏指在某些情况下,派生类中的函数屏蔽了基类中的同名函数。这些情况包括两个函数参数相同,但是基类不是虚函数。---(参数不同可以实现重载)
区别:和覆盖的区别在于基类函数是否是虚函数。

可以使用using声明解决基类成员被隐藏的问题,例如:

class Base {
public:
    virtual void f(int) { std::cout << "Base::f\n"; }
    void g(char)        { std::cout << "Base::g\n"; }
    void h(int)         { std::cout << "Base::h\n"; }
protected:
    int m;
private:
    int k;
};

class Derived : public Base {
public:
    using Base::m; // 此时 m 为public
//    using Base::k; // error报错

    using Base::f;
    void f(int) { std::cout << "Derived::f\n"; } // D::f(int) 覆盖 B::f(int)

    using Base::g; // 不声明的话,需要通过 obj.Base::g 使用
    void g(int) { std::cout << "Derived::g\n"; } // g(int) 与 g(char) 均作为派生类的成员可见,实现 重载

    using Base::h;
    void h(int) { std::cout << "Derived::h\n"; } // D::h(int) 隐藏 B::h(int)
};

int main()
{
    Derived derived;
    Base &base = derived;

    derived.m = 1;

    base.f(1);      // Derived::f 虚函数多态
    derived.f(1);   // Derived::f

    derived.g('a'); // Base::g    重载
    derived.g(1);   // Derived::g 重载

    base.h(1);      // Base::h    基类引用没有实现动态多态
    derived.h(1);   // Derived::h 隐藏
}

标签:函数,覆盖,同名,基类,重载,隐藏
From: https://www.cnblogs.com/devin1024/p/17490031.html

相关文章

  • 函数重载及其匹配顺序
    1.函数重载概念:同一个作用域内,同名函数,参数列表不同(参数个数、类型或顺序不同)。与返回值类型没有关系。如果函数名和参数列表相同,无论返回值类型是否相同,会编译错误(函数重定义)const是有效的重载。仅默认参数值不同不是有效的重载。例如intfun(inta=0);//voidfun(i......
  • 运算符重载知识点总结
    #运算符重载在数学上,两个复数可以直接进行+、-等运算。但在C++中,直接将+或-用于复数对象是不允许的。•有时会希望,让对象也能通过运算符进行运算。这样代码更简洁,容易理解。•例如:complex_a和complex_b是两个复数对象;求两个复数的和,希望能直接写:complex_a+complex_b在数学上......
  • “子绝父相”能实现元素覆盖么?
    当将父元素设置position:relative;,子元素设置position:absolute;时,能实现子元素覆盖在父元素上面。<head><style>.box1{position:relative;background-color:greenyellow;height:50px;width:50px;......
  • 靶机2020web隐藏信息探索
     个人感觉这套做题法是非常快的,本文可能有点啰嗦,请各位务必耐心看完,相信看完的各位一定会有所学成! #绿色字体代表解析,红色字体是答案,橙色代表方法一,通过本地PC中渗透测试平台Kali对服务器场景Web20200529中的网站进行访问,找到登录界面中的FLAG,并将FLAG提交直接在url里面输入靶机I......
  • 凌乱的yyy / 线段覆盖
    题目背景快noip了,yyy很紧张!题目描述现在各大oj上有\(n\)个比赛,每个比赛的开始、结束的时间点是知道的。yyy认为,参加越多的比赛,noip就能考的越好(假的)。所以,他想知道他最多能参加几个比赛。由于yyy是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加\(2\)个......
  • 【初识C++】(缺省参数和函数重载)
    @TOC一、缺省参数1.缺省参数定义缺省参数是在函数的声明中给定参数一个指定的值。如果传参没有给定参数,那就按照声明中默认的缺省值,如果给定了参数,那就按照给定的参数值。比如:usingnamespacestd;voidFunc(inta=0){ cout<<a<<endl;}intmain(){ Func(); //......
  • 02项目数据库隐藏密码,封装logger,环境变量的设置,封装全局异常,Response,开启media访问,前
    1项目数据库之隐藏密码#我们直接把mysql的用户名和密码写死在了代码中----》后期可能会存在风险----》代码如果泄露----》mysql的用户密码泄露----》可以远程登录----》脱裤(拖库)----》所有数据会被黑客获取到----》卖钱#华住---》在代码中把数据库用户名和密码写死了----》......
  • easyui-datagrid 显示和隐藏
    easyui-datagrid显示和隐藏有点特殊正常使用的  style="display:none;"不起作用需要在外面套一个  easyui-panel  ,控制easyui-panel来间接控制  easyui-datagrid <divid='div_toexcel'class='easyui-panel'closed='true'><tableid=......
  • C++ 中的运算符重载
     您可以重定义或重载大部分C++内置的运算符。这样,您就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数,函数名是由关键字operator和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。https://www.tzffs.com/lnzt15/......
  • (转)别人记录的第三方安全扫描报告问题处理汇总,覆盖了大部分遇到的
    http://wpcms.zdsoft.net/newsInfo.aspx?pkId=173http://www.taodudu.cc/news/show-5963408.html?action=onClick检测到目标服务器存在应用程序错误修改网站web.config配置,已关闭详细错误信息显示。将mode值修改为On<system.web>   <customErrors mode="On">   </c......