Non capisco cosa c'è di sbagliato in questo codice. Sembra una trappola incredibile!Strano comportamento quando si chiamano le funzioni virtuali
Questo codice:
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;
}
stampa il seguente output:
9 6
25 25
deduco che Bar::foo(double) const
si chiama con un cast implicita quando il tipo del puntatore è Bar*
. Ma perché una cosa del genere è possibile senza alcun preavviso?
Lavoro con GCC 4.7.2. Compilato con g++ -Wall foobar.cpp -o foobar.exe
penso che sarebbe meglio se si sceglie il secondo numero di un altro di 2. A causa 2 * 2 = 4 e 2 + 2 = 4. – nabroyan
Sono curioso, hai lo stesso problema se il valore di ritorno di 'foo (int)' è anche 'int'? @nabroyan infatti, sarebbe ancora meglio usare lo stesso valore (ma di tipo diverso): '3' e' 3.0'. – Kryptos
Possibile duplicato di http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-derived-class-hide-other-overloads-of-the e http: // stackoverflow. it/questions/411103/function-with-same-name-but-different-signature-in-derivata-class – Kryptos