重写虚函数返回参数有差异
这是一个The Ultimate Toolbox开源程序中的问题
有类
class OX_CLASS_DECL COXMenuBar : public COXCoolToolBar /*COXCoolToolBar继承与CToolBar*/
{
....
....
public:
HMENU GetMenu() const
{
ASSERT(::IsWindow(GetSafeHwnd()));
return m_hMenu;
}
....
....
}
本来在05下很正常,今天拿到08下报错:
error C2555: “COXMenuBar::GetMenu”: 重写虚函数返回类型有差异,且不是来自“CWnd::GetMenu”的协变
后来我找了下发现如下MFC函数:
CMenu* CWnd::GetMenu() const;
我理解08的错误 首先CWnd::GetMenu()不是虚函数,那么 COXMenuBar::GetMenu()只能重载或者覆盖父类CWnd::GetMenu()。
而结果是重载的话 参数形式完全相同(都没有参数)所以不是重载,覆盖的话返回类型不同 所以08报错!
但问题是 05 为什么就ok了呢?
[解决办法]
首先只有返回值不一样的函数是不合法的,在有的编译器容忍这种错误,只能说它不严格。
至于错误信息,很可能只是错误信息表达不准确。在错误情况下,有时编译器报了一些偏差信息也是可能的,这只是编译器对错误情况分类不够仔细之故!在很多情况下,在派生类重写基类函数,多是虚函数,也许这是分类成虚函数的原因