相关疑难解决方法(0)

base和derived类中具有相同名称的对象不会被标记为错误

class Base
{
public:
 type1 m_Pants;
};

class Derived : Base
{
public:
 type2 m_Pants
};
Run Code Online (Sandbox Code Playgroud)

这基本上没有被标记为错误,但是在整个项目中创建了各种各样的破坏和问题.

有没有人知道不会标记这一点的技术性?

c++ inheritance

8
推荐指数
2
解决办法
4109
查看次数

在C++中,何时可以在同一范围内看到两个同名变量?

这段代码说明了我认为应该被视为不良做法的内容,并引发编译器关于重新定义或屏蔽变量的警告:

#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++ standards warnings compiler-warnings

6
推荐指数
3
解决办法
1万
查看次数

派生类成员遮蔽基类成员的警告

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)

https://godbolt.org/g/fBMUAd

背后有原因吗?

c++ g++ compiler-warnings visual-c++ clang++

5
推荐指数
1
解决办法
2452
查看次数