【发布时间】:2015-06-10 08:51:13
【问题描述】:
我不明白这段代码有什么问题。它看起来像一个不可思议的陷阱!
这段代码:
class Foo
{
public:
virtual double foo(double x) const = 0;
double foo(int x) const { return (double)(x + x); }
};
class Bar : public Foo
{
public:
virtual double foo(double x) const { return x * x; }
};
int main()
{
Bar* b = new Bar;
Foo* f = b;
std::cout << b->foo(3) << " " << f->foo(3) << std::endl;
std::cout << b->foo(5.0) << " " << f->foo(5.0) << std::endl;
return 0;
}
打印以下输出:
9 6
25 25
我推断当指针的类型为Bar* 时,Bar::foo(double) const 是通过隐式转换调用的。但是为什么会在没有任何警告的情况下发生这样的事情?
我使用 GCC 4.7.2。我用g++ -Wall foobar.cpp -o foobar.exe编译
【问题讨论】:
-
我认为如果你选择第二个数字而不是 2 会更好。因为 2*2=4 和 2+2=4。
-
我很好奇,如果
foo(int)的返回值也是int,你有同样的问题吗? @nabroyan 确实,使用相同的值(但类型不同)会更好:3和3.0。 -
你是对的。我换成了
5.0。 -
@Kryptos:是的,同样的行为。