考虑以下示例:
#include <iostream>
#include <string>
class Base {
public:
virtual void func(int a) {}
};
class Derived : public Base {
public:
void func( const int a) override {
}
};
int main()
{
Derived d;
d.func(1);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我重写了该func方法,但将const添加到参数中,在这种情况下,链接器应发出错误消息。函数不被覆盖,或者函数参数不应为const。
但是令我惊讶的是,此代码可以链接并起作用。
我想念什么吗?为什么此代码有效?
尽管类似于带有const参数并重载的函数,但它解决了一个不同的问题。这个问题是关于不可能重载基类的方法,而这个问题解决了能够覆盖派生方法的问题。
我有点困惑.在开发基于预定义参数的一个函数期间,根据它们的类型传递给sprintf函数所需的精确参数,我发现了非常奇怪的行为(类似于"这是%f%d示例",typeFloat,typeInt).
请查看以下剥离的工作代码:
struct Param {
enum { typeInt, typeFloat } paramType;
union {
float f;
int i;
};
};
int _tmain(int argc, _TCHAR* argv[])
{
Param p;
p.paramType = Param::typeInt;
p.i = -10;
char chOut[256];
printf( "Number is %d\n", p.paramType == Param::typeInt ? p.i : p.f );
printf( "Number is %f\n", p.paramType == Param::typeInt ? p.i : p.f );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的预期产量将是 printf( "Number is %d\n", p.paramType == Param::typeInt ? p.i : p.f );
Number is -10
Run Code Online (Sandbox Code Playgroud)
但它确实打印出来了
Number …Run Code Online (Sandbox Code Playgroud) 我分为9501/100.0f期望得到95.01f的结果,但由于一些不正常的原因,结果是95.01000000002f.
我知道舍入错误,并且划分两个较大的浮点数会产生不正确的结果,但这两个数字相对较小,它们不应该给出错误的答案.
我已将浮动更改为双打,但只能看到相同的结果.
所以我的答案是,为什么我看到这个错误的输出?
并最终解决方法,而无需将数字复制到字符串和返回.