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;
}
}; |
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(); |
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 |
virtual void derived::foo(int): 42
virtual void derived::foo(int): 100
Dlaczego wywołania, które powinny być identyczne jednak takie nie są?