编译器不应该对派生类中隐藏的基本结构的成员变量发出警告吗?
Shouldn't a compiler raise a warning for member variables of base struct shadowed in derived class(es)?
我意外地遮蔽了一个(基本)结构的某些成员变量,其中私有成员在基本结构中得出的类中。
struct Base {
int a;
}类派生:公共基础{
私人:
int a;
...
在我的情况下,这是一个错误由于我认为有目的的阴影成员确实很少见(如果根本不考虑不良的习惯),我想知道为什么编译器至少没有提出警告(好的,不是错误,因为合法允许阴影)?
我使用的编译器是Microsoft Visual C 2015,警告级别4)。
我想知道其他编译器(即GCC)是否为这种情况提供了特定的警告?
阴影是否不好还是好取决于您引入冲突名称的顺序。
假设您有一个课堂库,其中一个是:
struct Base {
int a;
};
稍后,使用您的班级库的客户A写了以下内容:
class DerivedA : public Base {
private:
int a;
};
在这种情况下,阴影可能是意想不到的。客户意外阴影Base::a
。
但是,假设您也有客户b,谁写了这一点:
class DerivedB : public Base {
private:
int b;
};
到目前为止一切都很好。现在,您构建库,因此使用Base
对象,使用您的库的客户B构建了同时使用Base
和DerivedB
对象的代码。
几周后,您意识到要获得新功能,您需要将新成员添加到Base
。
struct Base {
int a;
int b; // new member variable
};
这会为您的库带来问题吗?它是否与客户b?
造成了问题不,它不会造成任何问题。
使用Base
的所有代码都将继续使用Base
,并且可以使用b
成员获得Fancy新的b
功能。即使DerivedB
对象传递给了预期Base
的函数,Derived
正在遮蔽b
这一事实对Base
没有影响。您使用Base
的功能可以说b
,它将访问Base
成员变量。
同时,使用DerivedB
的所有客户B代码将继续使用DerivedB
,当该代码称为b
时,它会像以前一样获得DerivedB::b
。ph,阴影节省了一天!
(当然,如果客户B想要开始利用新的b
功能,那么客户B必须做额外的工作以解决冲突。但是重要的是,阴影并没有在现有代码。)
在一天结束时,无论阴影是好还是坏取决于您引入冲突名称的顺序。这不是编译器洞察的东西。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- C++预处理会生成变量成员、资源库和映射
- 局部堆栈变量成员的返回值优化
- Google Mock:在目标类的构造函数中实例化的模拟私有变量成员
- 使用指向结构变量成员的指针访问该结构的成员的地址
- 如果派生类仅包含自动变量成员,是否有必要具有虚拟驱动器
- 线程安全性和静态变量/成员功能
- "static const char array"可以在 C 语言上包含变量成员吗
- 仅用于内部目的的类的所有变量/成员的技术术语是什么
- 如何强制转换变量成员以将其作为函数的引用参数传递
- 类中未声明变量成员函数
- 在 main 中初始化类的 "static const" 类型变量成员的更好方法
- c++模板类静态const变量成员作为映射键给出未定义引用
- 在类中初始化结构变量成员会导致分割错误
- 在c++中建模变量成员类型
- 模板私有静态变量成员的未定义符号
- 不能访问公共静态变量成员
- 常量变量成员在C++有什么用?
- g++ 4.8.2坚持简单变量成员是数组