因此,我注意到Xcode(v6.2)似乎并没有像Visual Studio那样在纯虚函数中强制执行const。几个问题: 1)如果我在一个具有const参数的基类中有一个纯虚拟,并且当它在derrived类中定义时它是非const ...那么符合ANSI标准并且: 2)有没有办法让Xcode像Visual Studio一样抛出错误?
在第一个块中,我们有头文件,它有一个纯虚函数。
// Some header file (assume include guards and all that fun stuff)
namespace Testing123
{
class ClassA
{
public:
// ************ NOTICE THAT THE ARGUMENT IS CONST!!! ***************
virtual double somePureVirtualFunk( const double someNumber ) = 0;
protected:
inline double getSomeFunkyNumber(){ return m_something; };
private:
double m_something;
}
}
现在在第二个文件中,我们有一个派生类的头,它有一个内联函数,用于定义ClassA中的纯虚拟...
// Some header file (assume include guards and all that fun stuff)
#include "ClassA.h"
namespace Testing123
{
class ClassB : public ClassA
{
public:
// ************ NOTICE THAT THE ARGUMENT IS **NOT** CONST!!! *************
inline virtual double somePureVirtualFunk( double someNumber )
{ return this->getSomeFunkyNumber(); };
}
}
所以我认为这证明了我所看到的,在ClassA中,somePureVirtualFunk被声明为具有const参数,当它在ClassB中定义时,constness缺失。 Visual Studio提醒您注意这一事实,Xcode没有。有没有办法让Xcode警告我这个?
答案 0 :(得分:4)
1)符合标准。顶级const
被忽略,因此
virtual double somePureVirtualFunk( const int someNumber ) = 0;
与此
完全相同virtual double somePureVirtualFunk( int someNumber ) = 0;
将函数中的const
设置为声明是没有意义的,因为它会被忽略。它可以用作函数的定义中使用的实现细节,它只是意味着不能在函数体中修改局部参数。
double ClassB::somePureVirtualFunk(const int someNumber )
{
// someNumber cannot be modified here.
// But it is local, so nobody needs to know.
}
请注意,这仅适用于顶级const
,如您的示例所示。
2)鉴于功能签名是相同的,我不确定警告会有多大用处。一个好的警告是告诉你在函数声明中有一个顶级const限定符,并且它没有效果。