Weźmy za przykład następujące klasy:
struct base { virtual void foo(int value = 42) { cout << __PRETTY_FUNCTION__ << ": " << value << endl; } }; struct derived : base { virtual void foo(int value = 100) override { cout << __PRETTY_FUNCTION__ << ": " << value << endl; } }; |
Nic niezwykłego, typowy dynamiczny polimorfizm. Każdy znający podstawy C++ powinien zdawać sobie sprawę, że w poniższym kodzie dwukrotnie zostanie wywołana funkcja derived::foo:
derived obj; base* b = &obj; derived* d = &obj; b->foo(); d->foo(); |
Zaskakujące może jednak być faktyczne wyjście:
virtual void derived::foo(int): 42 virtual void derived::foo(int): 100 |
Dlaczego wywołania, które powinny być identyczne jednak takie nie są?