2015-10-17 81 views
0

我有一个基类:如何避免在Visual Studio下的名称隐藏警告?

#define OUT 
#define NO_VTABLE __declspec(novtable) 

class NO_VTABLE Foo 
{ 
public: 

    virtual bool TestSomething() const = 0; 

    virtual bool TestSomething(OUT unsigned int& extendedInfo) const { 
     UNUSED(extendedInfo); 
     return TestSomething(); 
    } 
}; 

而派生类:

class NO_VTABLE Bar : public Foo 
{ 
public: 

    virtual bool TestSomething() const { 
     // Do the test, return the result... 
    } 
}; 

GCC下,该程序与-Wall -Woverloaded-virtual完全编译。在Visual Studio下,我得到一个脏编译。以上显示的TestSomethingAvailable

1> ...\derived.h(78) : warning C4266: 'bool DeviceState::Available(unsigned int &) const' : 
    no override available for virtual member function from base 'DeviceState'; function is hidden 
1>  ...\base.h(794) : see declaration of 'DeviceState::Available' 
1>  ...\base.h(787) : see declaration of 'DeviceState' 

删除NO_VTABLE没有区别。警告仍然存在。

所有TestSomething都是公开的在基类和派生类中都是虚拟的,所以它对我来说不清楚从调用者隐藏什么。

我正在Visual Studio下进行测试,并且在Visual Studio 2005,2008和2010上都遇到过它。我还有其他VS进行测试,但在这一点上,我知道它不是一次性的,关闭。

我不想关闭警告,因为文件base.h很大,有很多类,它可能在将来遇到其他问题。

Visual Studio声明对调用者隐藏了什么? Visual Studio下警告的来源是什么?如何清除它?

+0

作为一种解决方法,您可以在导致问题的行周围推送和弹出警告 - 毕竟这些都是非常旧的编译器。 – Rostislav

+0

@Rostislav - 谢谢。编译器版本与它有什么关系?据我所知,都是C++ 03,它符合项目的要求。 – jww

回答

1

如果你查找错误C4266,你会发现它说A derived class did not override all overloads of a virtual function.因此,对于这个编译器,你需要覆盖unsigned int &变体的所有重载。

我没有抬头看语言规范,看看这是否符合。

+0

谢谢。对我来说混乱的一点是微软声称它是隐藏的。如何/为什么隐藏? – jww

+0

@jww由于'Testsomething()'在Bar中被重写,但是'TestSomething(unsigned int&)'不是。在类中有一个重载覆盖隐藏了非虚函数的基类中的所有其他重载,并且Microsoft也将其应用于虚函数。也可能要指出的是,在层次结构的某些部分('Bar'),重载将根本不可见,并且需要一些额外的投射来达到它。 – 1201ProgramAlarm

+0

它被隐藏了。你是否应该关心这个问题还不清楚。我们对你的用例或你最派生类的外观一无所知。 –