This jest w zasadzie kopią z przykładu podanego w Item 21. Overriding Virtual Functions
w książce Herba Suttera Exceptional C++
.Co to ma wspólnego z przeciążaniem funkcji?
#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;
}
drukuje kod Base::f(double)
i nie mam żadnych problemów z tym. Ale nie mogłem zrozumieć wyjaśnienie podane przez autora na górze strony 122 (podkreślenie moje):
Co ciekawe, mimo że podstawowa * pb jest skierowany do pochodnej obiektu, to nazywa Podstawa: : f (podwójne), , ponieważ rozdzielczość przeciążenia wynosi wykonana na statycznym typie (tutaj Base), a nie na typie dynamicznym (tutaj Pochodny).
Moje zrozumienie jest, że wezwanie pb->f(1.0)
to wirtualna rozmowa i Base::f(double)
jest ostateczna overrider dla f(double)
w Derived
. Co to ma wspólnego z przeciążaniem funkcji?
Zmień pb na 'Pochodny *' i obserwuj, co się stanie. – dlf
@dlf: i kompilator podaje również ostrzeżenie :-) – Jarod42
Ten tytuł nie jest zbyt użyteczny. Wyobraź sobie, co myślisz, gdy zobaczysz to w wynikach wyszukiwania. –