C++中using引入基类同名函数和变量为何重定义表现不同
C++同名成员重定义规则差异解析
核心差异在于C++的重载规则仅适用于函数,不适用于变量,using声明对函数和变量的处理逻辑存在明确区别。
1. 成员函数场景不触发重定义的原因
- C++的
using 基类::函数名的作用是:将基类中所有该名字的函数重载集合,引入到派生类的当前作用域,避免派生类的同名函数默认隐藏所有基类同名重载。 - 派生类可以定义和引入的基类函数签名完全一致的函数,这不属于重定义:两个函数是分别属于基类、派生类的独立实体,仅在派生类的作用域中,派生类的同签名函数会覆盖
using引入的基类同签名版本,重载决议时会优先匹配派生类的实现。 - 你给出的代码中,派生类
human的running(char)和基类引入的running(char)属于上述场景,因此不会报错,调用时优先匹配派生类实现,输出I am a human。
2. 成员变量场景触发重定义的原因
- 重载规则仅对函数生效,成员变量不存在重载概念,同一作用域内不允许出现两个同名的变量实体,和类型无关。
- 当你在派生类中写
using being::v时,相当于将基类的int v直接引入到派生类的作用域,此时派生类作用域已经存在名字为v的实体,你再定义double v就属于同一作用域下的同名变量重定义,因此编译报错。 - 没有加
using声明时,基类的v默认被派生类的v隐藏,两个变量分别属于基类、派生类的作用域,不存在同作用域重名问题,因此可以正常编译。
内容的提问来源于stack exchange,提问作者Fady Hany
相关产品推荐
相关产品推荐

