目录

  • 1、继承中的名字隐藏
    • 1.基类同名函数被隐藏的现象描述
    • 2.问题理解
    • 3.避免现象
  • 2、重定义
    • 1.现象描述
    • 2.重定义与重载的区别
    • 3.能否使用 using 将基类成员引入到派生类定义中

1、继承中的名字隐藏

1.基类同名函数被隐藏的现象描述

在学习变量作用域的时候知道,全局变量可能被函数里面的同名局部变量所隐藏,如果要在函数里面使用这个同名全局变量,那么就要使用域解析运算符。

在继承中也会出现上述类似的情况,下面是名字隐藏的形式:

基类和派生类中都有一个同名函数,不同的是派生类的函数有个整型形参。

在主函数中调用f(),那么调用的到底是基类的函数还是派生类的函数?

class P{public:void f(){}
};class C :public P{public:void f(int x){}
};
int main()
{C c;c.f();
}


编译器会报错。

2.问题理解

我们可以将派生类看做是内部作用域,基类看做是外部作用域。内部作用域的函数f()将外部作用域的f()给隐藏掉了。

那么在C类中就看不到基类中的f()同名函数了。

这个做法可以帮助程序员避免写出带有危险性的代码。

3.避免现象

那么如何解决这个问题呢?
using 声明语句可以将基类成员引入到派生类定义中,显式声明。

class P{public:void f(){}
};class C :public P{public:using P::f;void f(int x){}
};
int main()
{C c;c.f();
}

其实还有两种写法:
1、

class P{public:void f(){}
};class C :public P{public:void f(int x){}
};
int main()
{C c;c.P::f();
}

2、

class P{public:void f(){}
};class C :public P{public:void f(int x){}
};
int main()
{C c;static_cast<P>(c).f();
}

2、重定义

1.现象描述

名字隐藏在重定义函数的时候有比较大的作用。因为有名字隐藏,所以我们可以在子类里面重新定义一个与基类里面名字参数一样的函数

之前定义了基类shape:

其中,toString函数用来描述对象的信息。基类可以调用这个函数,但是基类是无法输出派生类信息的。
例如形状就不能输出它的派生类:圆,的半径。只能输出颜色和是否填充。
我们可以在派生类里面重新定义toString函数用来描述派生类对象,这样就不会调用基类的toString函数了。

2.重定义与重载的区别

重载
多个函数名字相同,但至少以下一个特征不同:

1、参数类型(parameter type)

2、参数数量(parameter number)

3、参数顺序(parameter sequence)

重定义
1、函数特征相同:同名、同参数、返回值类型

2、在基类和派生类中都有定义

3.能否使用 using 将基类成员引入到派生类定义中

派生类B中的 foo()函数是对基类A中的 foo() 函数的重定义。
那么在类B中,能否使用 using 讲基类A中的foo()函数引入到派生类B中?为什么?

#include<iostream>#include<string>using namespace std; class A {public: string func() {        return "aaa";    }};class B :public A {public:using A::func; string func() {        return "bbb";    }}; int main() { A a; B b; cout<<a.func()<<endl;cout<<b.func()<<endl; }结果是:aaabbb编译运行正常通过,所以还是调用了 子类 的函数。

【C++grammar】名字隐藏与重定义相关推荐

  1. C++中的覆盖(重写)、重载、隐藏(重定义)、多态!

    例一: 首先声明Base类型的指针指向实际类型为Derived的对象,先调用基类构造函数,再调用派生类构造函数.输出Base, Derived. base->echo(); 指针是base类型, ...

  2. 重载、重写(覆盖)、隐藏(重定义)

    重载:一个类,函数名相同,参数不同 重写(覆盖):有virtual,一模一样,同名同参 隐藏: virtual可有可无,同名,参数列表不考虑.

  3. 8-3:C++继承之继承中的作用域,隐藏,重定义和静态成员

    文章目录 (1):继承中的作用域 (2):友元关系不能被继承 (3):静态成员和继承 (1):继承中的作用域 在学习作用域时,我们说过代码中可以定义在不同作用域中的同名变量,并且输出时会遵循就近原则. ...

  4. 第九天2017/04/18(3、重载/覆盖 PK 重写/重定义、父类子类混搭风、抽象类)

    1.重载/覆盖 PK 重写/重定义 [预备知识] 函数重载必须在同一个类中发生子类无法重载父类的函数,父类同名的函数将会被名称覆盖重载是在编译期间根据参数类型和个数决定函数调用重载只放在同一个类之中, ...

  5. 继承和多态 1.0 -- 继承概念(is-a、has-a,赋值兼容规则,隐藏重定义)

    普通继承和访问权限 当一个继承没有虚拟继承或者是多重继承时,就是一个简单的继承的时候,这个时候就是一个普通的继承. 普通继承的内存空间是:子类的对象中,包含了父类的成员变量,同时也可以调用父类的成员函 ...

  6. c++ 重载、重写、重定义(隐藏)

    1.重载overload:函数名相同,参数列表不同. 重载只是在类的内部存在,或者同为全局范围.(同名,同参函数返回值不同时,会编译出错.因为系统无法知晓你到底要调用哪一个.) 2.重写overrid ...

  7. 重载、重写(覆盖)、重定义(同名隐藏)的区别

    重载:指在同一作用域中允许有多个同名函数,而这些函数的参数列表不同,包括参数个数不同,类型不同,次序不同,返回值相同与否并不影响是否重载: 重写和重定义则有点像,区别就是在写重写的函数是否是虚函数,只 ...

  8. c语言 方法重载 冲定义,C++ 重载(overload)、重写(overrride)、重定义(redefine)

    今天参加了一个面试,问到了上面的C++知识点,都知道,时间久了难免遗忘,感觉回答的一般,不够专业,部分点还答错了,sigh!在此再补漏下. 注意:这些都是C++语言的特性,C语言连最简单的重载(ove ...

  9. 【校招面试 之 C/C++】第12题 C++ 重载、重写和重定义

    1.成员函数重载特征:    a.相同的范围(在同一个类中): b.函数名字相同: c.参数不同(参数个数不同或者参数类型不同,但是返回值不同不能使重载): d.virtual关键字可有可无. 2.重 ...

最新文章

  1. 9个点的所有解锁图_黔隆科技刷机教程酷派C1068忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
  2. psp进度(11月25号-31号)
  3. myeclipse文件目录自动定位(右编辑界面点击 左边Package Explorer导航自动定位)...
  4. python图像锐化_opencv实现图片模糊和锐化操作
  5. FatFs源码剖析(1)
  6. 02.CSS基础笔记及导入
  7. java nlpir_4-NLPIR汉语分词系统-JAVA
  8. 软硬件联合调试步骤_PLC与SCADA或第三方软件的联合仿真调试—NetToPLCSIM
  9. 【kali技巧】kali更新系统
  10. win7下获取进程CPU,内存,IO等信息
  11. 商鼎云|亚马逊云盘关停了?你需要了解分布式存储云盘
  12. 《计算机网络(第七版)谢希仁 编著》第一章内容总结及部分解题
  13. 知乎上线诺贝尔奖主题圆桌 让科普更加多元有趣
  14. win10系统怎么创建新连接服务器地址,Win10如何创建宽带连接以便接入Internet
  15. 拼多多商家如何虚假发货的情况出现?
  16. python作业答案用什么软件好_什么软件可以搜python答案
  17. Java程序设计教程(第三版) 雍俊海 7.3 答案/代码
  18. 第三章数字逻辑电路基础
  19. 互联网+5G,开创评标管理新模式
  20. java jit aot_AOT和JIT编译器之间的区别android

热门文章

  1. Effeckt.css – CSS3 Transitions Animations 精妙应用
  2. 关于设计模式的胡思乱想
  3. Inside Kolla - 04 Kolla 目录结构
  4. C# 如何跨平台调用C++的函数指针!
  5. 游戏、脑洞大开1(密码简单破译)
  6. 使用可视化工具redisclient连接redis
  7. 自定义URL Scheme完全指南
  8. JavaScript事件处理的三种方式(转)
  9. Jquery对复选框的操作
  10. asp.net mvc 2 DisplayTemplates 的使用