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++:名字查找先于类型检查的更多相关文章

  1. C++名字查找和重载

    重载函数的定义:在同一作用域内的几个函数名字相同但形参列表不同,称为重载函数.这里有一个重要的前提就是:同一个作用域: 而如果重载函数是定义在不同的作用域,那么一旦编译器在当前作用域找到所需的名字,编 ...

  2. tiger-complier 问题记录 类型检查

    1 注意区分 Ty_xxx 和 a_ 的区别 A 开头是对应的是原程序中的一个实体 Ty _ 开头则是类型检查中的一个抽象类 代表了一类实体 比如 A_recordTy 是原程序中的 type per ...

  3. python_如何对实例属性进行类型检查?

    案例: 在某项目中,我们实现了一些类,并希望能像静态语言那样对他们的实例属性进行类型检查 p = Person() p.name = 'xi_xi'         # 必须是str p.age = ...

  4. C++ Primer笔记3_默认实參_类初探_名字查找与类的作用域

    1.默认函数实參 在C++中,能够为參数指定默认值,C语言是不支持默认參数的,Java也不支持! 默认參数的语法与使用: (1)在函数声明或定义时,直接对參数赋值.这就是默认參数: (2)在函数调用时 ...

  5. 类型检查和鸭子类型 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 ...

  6. 【长文详解】TypeScript、Babel、webpack以及IDE对TS的类型检查

    只要接触过ts的前端同学都能回答出ts是js超集,它具备静态类型分析,能够根据类型在静态代码的解析过程中对ts代码进行类型检查,从而在保证类型的一致性.那,现在让你对你的webpack项目(其实任意类 ...

  7. 编译器开发系列--Ocelot语言6.静态类型检查

    关于"静态类型检查",想必使用C 或Java 的各位应该非常熟悉了.在此过程中将检查表达式的类型,发现类型不正确的操作时就会报错.例如结构体之间无法用+ 进行加法运算,指针和数值之 ...

  8. Java中静态类型检查是如何进行的

    以下内容来自维基百科,关于静态类型检查和动态类型检查的解释: 静态类型检查:基于程序的源代码来验证类型安全的过程: 动态类型检查:在程序运行期间验证类型安全的过程: Java使用静态类型检查在编译期间 ...

  9. Flow: JavaScript静态类型检查工具

    Flow: JavaScript静态类型检查工具 Flow是Facebook出品的,针对JavaScript的静态类型检查工具.其代码托管在github之上,并遵守BSD开源协议. 关于Flow 它可 ...

随机推荐

  1. [linux]解决vsftpd 读取目录列表失败的问题

    使用第三方FTP软件filezilla进行登陆,出现如下错误:状态:    正在连接 192.168.1.6:21...状态:    连接建立,等待欢迎消息...响应:    220 (vsFTPd ...

  2. Windows下修改Oracle监听端口

    先放开防火墙的端口,再来改监听端口. 只有一个实例: net stop OracleOraDb11g_home1TNSListener 再运行 NET Manager 修改实例名与Listener的端 ...

  3. sql server 去除(替换)空格,回车,换行 函数

    --create-- SQL去除回车符,换行符,空格和水平制表符create function RepSymbolChar(@str nvarchar(max))returns nvarchar(ma ...

  4. vuejs,router

    接下来我们要做的是vue的路由处理,首先当然是安装: npm install vue-router 接下打开我们的main.js,引入我们vue-router,然后在告诉vue我们要使用我们的vue- ...

  5. 线程Thread,有参数和参数

    一.不带参数的 using System; using System.Collections.Generic; using System.Text; using System.Threading; n ...

  6. SQL加权限

    grant view definition on 存储过程名字 to 用户名

  7. 数据结构与算法(1)支线任务3——Largest Rectangle in Histogram

    题目如下:(https://leetcode.com/problems/largest-rectangle-in-histogram/) Given n non-negative integers r ...

  8. 培训第四天-----jdbc连接oracle

    oracle链接数据库并向tableone插入中一条数据 package com.zjw.db; import java.sql.Connection; import java.sql.DriverM ...

  9. SQL Server查询分组结果中第一条记录的方法

    select * from (  select mp.MsgID,m.Content,m.CreatorID,m.CreateTime,ROW_NUMBER() over(partition by m ...

  10. 简单设置eworkflow条件的方式

    在eworkflow自定义工作流产品中,设置条件节点,是在节点的后续连线上设置的.每一个处理节点(除结束节点外)都至少有一条连线连接到下一个节点,当有多条连线连接到其他节点的时候,就需要在多出的连线上 ...