Tôi không hiểu điều gì sai với mã này. Nó trông giống như một cái bẫy đáng kinh ngạc!Hành vi lạ khi gọi các chức năng ảo
Mã này:
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;
}
in đầu ra sau đây:
9 6
25 25
Tôi suy luận rằng Bar::foo(double) const
được gọi với một diễn viên tiềm ẩn khi kiểu của con trỏ là Bar*
. Nhưng lý do tại sao một điều như vậy là có thể mà không có bất kỳ cảnh báo nào?
Tôi làm việc với GCC 4.7.2. Tôi đã biên soạn với g++ -Wall foobar.cpp -o foobar.exe
Tôi nghĩ rằng nó sẽ tốt hơn nếu bạn chọn số thứ hai của bạn khác hơn 2. Bởi vì 2 * 2 = 4 và 2 + 2 = 4. – nabroyan
Tôi tò mò, bạn có cùng một vấn đề nếu giá trị trả về của 'foo (int)' cũng là 'int'? @nabroyan thực sự, nó sẽ là tốt hơn để sử dụng cùng một giá trị (nhưng loại khác nhau): '3' và' 3.0'. – Kryptos
Bản sao có thể có của http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-derived-class-hide-other-overloads-of-the và http: // stackoverflow. com/questions/411103/function-with-same-name-but-different-signature-in-derived-class – Kryptos