我不明白這段代碼有什麼問題。它看起來像一個驚人的陷阱!調用虛擬函數時出現奇怪的行爲
此代碼:
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::foo(double) const
調用與隱式轉換時的指針的類型是Bar*
。但是爲什麼這樣的事情可能沒有任何警告?
我使用GCC 4.7.2。我使用g++ -Wall foobar.cpp -o foobar.exe
我認爲這將是更好,如果你選擇你的第二個號的另一個大於2由於2×2 = 4, 2 + 2 = 4。 – nabroyan
我很好奇,如果'foo(int)'的返回值也是'int',你有同樣的問題嗎?確實,使用相同的值(但不同的類型)會更好:'3'和'3.0'。 – Kryptos
http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-derived-class-hide-other-overloads-of-the和http:// stackoverflow可能出現重複。 com/questions/411103/function-with-same-name-but-different-signature-in-derived-class – Kryptos