C++:名字查找先于类型检查
Sub-Title: Name Hiding。
"In C++, there is no overloading across scopes - derived class scopes are not an exception to this general rule."
这是C++之父 Bjarne亲口说的话,也是C++不能“跨类重载”的原因(而Java却能做到),在C++ Primer也翻到了解释。
P549:
声明在内层作用域的函数并不会重载声明在外层作用域的函数,因此,定义在派生类中的函数也不会重载其基类中的成员,和其他作用域一样
如果派生类的成员与基类的某个成员同名,则派生类则将在其作用域内隐藏该基类成员。即使派生类成员和基类成员的形参列表不一致,基类
成员也仍然会被隐藏掉。
P551:
和其他函数一样,成员函数无论是否是虚函数都能被重载,派生类可以覆盖重载函数的0个或多个实例。如果派生类希望所有的重载版本对于它
来说都是可见的,那么它就需要覆盖所有的版本,或者一个都不覆盖。
有时候一个类仅需覆盖重载集合中的一些而非全部函数,此时,一种好的解决方案是为重载的成员提供一条using语句。
关于这个问题,可以参考:stackoverflow。
另外,仿佛更深刻地理解了虚函数的工作机制(重写必须形参完全相同),以及为什么Java接口多继承时必须覆盖default方法了(有冲突的情况下)。
注意,虚函数表每个类维护一张表,只有在重写的情况下(名字和形参完全相同),才会将父类那个虚函数地址换成子类的虚函数地址,
如果不是这种情况(例如函数名字相同但参数不同),都会在虚函数表后新添一项。
记住:C++中的name hiding机制、如果再和virtual 和 non-virtual函数混合在一起的话会很蛋疼(Java中就没有这破事),所以最好是遵循
best practice:不要覆盖父类的非虚函数,要想覆盖父类函数就把它变虚,注意using声明的使用。
C++:名字查找先于类型检查的更多相关文章
- C++名字查找和重载
重载函数的定义:在同一作用域内的几个函数名字相同但形参列表不同,称为重载函数.这里有一个重要的前提就是:同一个作用域: 而如果重载函数是定义在不同的作用域,那么一旦编译器在当前作用域找到所需的名字,编 ...
- tiger-complier 问题记录 类型检查
1 注意区分 Ty_xxx 和 a_ 的区别 A 开头是对应的是原程序中的一个实体 Ty _ 开头则是类型检查中的一个抽象类 代表了一类实体 比如 A_recordTy 是原程序中的 type per ...
- python_如何对实例属性进行类型检查?
案例: 在某项目中,我们实现了一些类,并希望能像静态语言那样对他们的实例属性进行类型检查 p = Person() p.name = 'xi_xi' # 必须是str p.age = ...
- C++ Primer笔记3_默认实參_类初探_名字查找与类的作用域
1.默认函数实參 在C++中,能够为參数指定默认值,C语言是不支持默认參数的,Java也不支持! 默认參数的语法与使用: (1)在函数声明或定义时,直接对參数赋值.这就是默认參数: (2)在函数调用时 ...
- 类型检查和鸭子类型 Duck typing in computer programming is an application of the duck test 鸭子测试 鸭子类型 指示编译器将类的类型检查安排在运行时而不是编译时 type checking can be specified to occur at run time rather than compile time.
Go所提供的面向对象功能十分简洁,但却兼具了类型检查和鸭子类型两者的有点,这是何等优秀的设计啊! Duck typing in computer programming is an applicati ...
- 【长文详解】TypeScript、Babel、webpack以及IDE对TS的类型检查
只要接触过ts的前端同学都能回答出ts是js超集,它具备静态类型分析,能够根据类型在静态代码的解析过程中对ts代码进行类型检查,从而在保证类型的一致性.那,现在让你对你的webpack项目(其实任意类 ...
- 编译器开发系列--Ocelot语言6.静态类型检查
关于"静态类型检查",想必使用C 或Java 的各位应该非常熟悉了.在此过程中将检查表达式的类型,发现类型不正确的操作时就会报错.例如结构体之间无法用+ 进行加法运算,指针和数值之 ...
- Java中静态类型检查是如何进行的
以下内容来自维基百科,关于静态类型检查和动态类型检查的解释: 静态类型检查:基于程序的源代码来验证类型安全的过程: 动态类型检查:在程序运行期间验证类型安全的过程: Java使用静态类型检查在编译期间 ...
- Flow: JavaScript静态类型检查工具
Flow: JavaScript静态类型检查工具 Flow是Facebook出品的,针对JavaScript的静态类型检查工具.其代码托管在github之上,并遵守BSD开源协议. 关于Flow 它可 ...
随机推荐
- Selenium2入门(二)WebDriver
前文Selenium2入门(一)说到Selenium是Web 应用程序测试框架,那么如果对一个简单的web应用需求:打开浏览器,登录百度首页,输入“欧洲杯”关键词,点击搜索按钮 这一系列操作,能否用S ...
- Django Form and Modelform Admin定义 高级查询)
Django的form表单一般具有两种功能 1. 验证输入 2.输入HTML ---------模板----------- from django import forms class BookFor ...
- 将JSON格式的时间/Date(2367828670431)/格式 转为正常的年-月-日 格式
function formatDate(NewDtime) var dt = new Date(parseInt(NewDtime.slice(6, 19))); var year = dt.getF ...
- ES6特性
一.ES6特性: let, const, class, extends, super, arrow functions, template string, destructuring, default ...
- 【MySQL】SQL优化系列之 in与range 查询
首先我们来说下in()这种方式的查询 在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的. ...
- ORM框架详解
.Net开源微型ORM框架测评 什么是ORM? 对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象 ...
- css3画三角形的原理
以前用过css3画过下拉菜单里文字后面的“下拉三角符号”,类似于下面这张图片文字后面三角符号的效果 下面是一个很简单的向上的三角形代码 #triangle-up { width: 0; height: ...
- sql查询语句如何解析成分页查询?
我们公司主要mysql存储数据,因此也封装了比较好用mysql通用方法,然后,我们做大量接口,在处理分页查询接口,没有很好分查询方法.sql查询 语句如何解析成“分页查询”和“总统计”两条语句.可能, ...
- [转]SQL Server 连接串关键字别名
转自:http://stackoverflow.com/questions/3077412/what-is-the-difference-between-trusted-connection-and- ...
- iscroll4 捕捉元素开发手机焦点图滑动效果
html标准代码格式 <div id="wrapper"> <div id="scroller" > <ul id="t ...