This è fondamentalmente una copia dell'esempio fornito in Item 21. Overriding Virtual Functions
nel libro di Herb Sutter Exceptional C++
.Che cosa ha a che fare con l'overloading delle funzioni?
#include <iostream>
#include <complex>
using namespace std;
class Base
{
public:
virtual void f(int);
virtual void f(double);
virtual ~Base() {};
};
void Base::f(int) { cout << "Base::f(int)" << endl; }
void Base::f(double) { cout << "Base::f(double)" << endl; }
class Derived: public Base {
public:
void f(complex<double>);
};
void Derived::f(complex<double>) { cout << "Derived::f(complex)" << endl; }
int main()
{
Base* pb = new Derived;
pb->f(1.0);
delete pb;
}
Le stampe codice Base::f(double)
e non ho problemi con quello. Ma non riuscivo a capire la spiegazione data dall'autore sulla parte superiore della pagina 122 (corsivo è mio):
È interessante notare che, anche se la base * pb punta a un oggetto derivato, ciò richiede Base: : f (double), perché la risoluzione di sovraccarico è eseguita sul tipo statico (qui Base), non sul tipo dinamico (qui derivato).
La mia comprensione è che la chiamata è una chiamata pb->f(1.0)
virtuale e Base::f(double)
è l'overrider finale per f(double)
in Derived
. Che cosa ha a che fare con l'overloading delle funzioni?
Cambia pb in un oggetto 'Derivato * 'e osserva cosa accadrà. – dlf
@dlf: e il compilatore dà anche l'avviso :-) – Jarod42
Questo titolo non è molto utile. Immagina cosa penseresti se lo vedessi nei risultati di ricerca. –