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 它可 ...
随机推荐
- appsrequest v3 发布了
程序猿们,想做windows app 不知道做什么项目的人可以上这个交流平台,获得创意,免费的:www.appsrequest.net
- mysql密码重置
忘记了Mysql的root用户密码,尝试连接时提示: mysqladmin: connect to server at 'localhost' failed ERROR : Access denied ...
- 【java】org.apache.commons.lang3功能示例
org.apache.commons.lang3功能示例 package com.simple.test; import java.util.Date; import java.util.Iterat ...
- some notes about spring aop
1 . timeCountIntecetor implements handlerInterceptor { preHandle(); postHandle(); afterComplete(); } ...
- 深入理解Session与Cookie
Session与cookie的作用都是为了保持访问用户与后端服务器的交互状态. cookie通过把所有要保存的数据通过HTTP协议的头部从客户端传递到服务端,又从服务端再传回到客户端,所有的数据都存储 ...
- java安全沙箱(四)之安全管理器及Java API
java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...
- yum提示This system is not registered with RHN.RHN support will be disabled.
[root@cactiez ~]# yum install mlocateLoading "security" pluginLoading "rhnplugin" ...
- 升级到VS2013.Update.4的问题
升级到VS2013.Update.4后,编译VS2010的解决方案出错,提示AxImp.exe找不到,到网上搜索后,没有找到能用的法子: 修复VS2013后也无法解决: 折腾2个小时后终于找到问题了: ...
- StackPanel在增加控件的问题
今天遇到这样一个问题,就是我做了一个自定义控件.然后加到StackPanel中, <StackPanel Height="676" HorizontalAlignment=& ...
- C++设计模式-Facade模式
Facade模式 作用:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 动机 将一个系统划分成为若干个子系统有利于降低系统的复杂性.一 ...