class Base
{
public:
type1 m_Pants;
};
class Derived : Base
{
public:
type2 m_Pants
};
Run Code Online (Sandbox Code Playgroud)
这基本上没有被标记为错误,但是在整个项目中创建了各种各样的破坏和问题.
有没有人知道不会标记这一点的技术性?
这段代码说明了我认为应该被视为不良做法的内容,并引发编译器关于重新定义或屏蔽变量的警告:
#include <iostream>
int *a;
int* f()
{
int *a = new int;
return a;
}
int main()
{
std::cout << a << std::endl << f() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它的输出(用g ++编译):
0
0x602010
Run Code Online (Sandbox Code Playgroud)
我看了几个引用(Stroustrup和完整的C++参考),但找不到关于何时以及为什么允许这样做的任何内容.但我知道它不在一个局部范围内.
何时以及为何允许这样做?这个结构有用吗?我怎样才能让g ++警告我呢?其他编译器是否会喋喋不休?
C++ 编译器会在局部变量隐藏另一个变量时发出警告。例如https://godbolt.org/g/TYYf8F
然而,当派生类的成员隐藏基类的成员时,没有一个主要的 C++ 编译器发出警告:
class A
{
int _memberVar = 2;
public:
virtual int memberVar()
{
return _memberVar;
}
};
class B : public A
{
int _memberVar = 3;
};
int main()
{
A* pB = new B();
return pB->memberVar(); // returns 2
}
Run Code Online (Sandbox Code Playgroud)
背后有原因吗?