Witam postanowiłem zapytać o coś czego nie do końca rozumiem. Otóż mam problem dotyczący pewnego zagadnienia związanego z jak mniemam działania funkcji wirtualnych w c++. Problem dobrze przedstawi pewien kawałek kodu. Otóż mamy taką sytuację, w wyniku której na konsoli ukazuje się nam liczba 16. I teraz poblem mój tkwi w tym dlaczego akurat 16. Wiadomo mamy wskaźnik klasy bazowej, który wskazuję na obiekt klasy pochodnej. Wywoływana jest funkcja shift, a jako że jest ona funkcją wirtualną w klasie bazowej zostanie wywołana jej definicja z klasy pochodnej, która zwraca nam parametr n przesunięty bitowo o 3 miejsca. W wypadku nie podania parametru jest ustawiony parametr domyślny n=3. Jeżeli wykonamy na nim operacje przesunięcia bitowego o 3 miejsca w lewo to mamy następująco : 00000011->00011000 co daje nam liczbę 24 (zły wynik). Oczywiście wynik byłby poprawny dla parametru n=2, który jest podany jako domyślny parametr n w definicji funkcji shift klasy bazowej. Nie dokońca rozumiem dlaczego parametr domyślny miałby być ustawiony w definicji klasy bazowej a wywołana została funkcja klasy pochodnej.
#include "stdafx.h"
#include <iostream>
using namespace std;
class B
{
public:
virtual int shift(int n = 2) const { return n << 2; }
};
class D
: public B
{
public:
int shift(int n = 3) const { return n << 3; }
};
int _tmain(int argc, _TCHAR* argv[])
{
const D d;
const B *b = &d;
std::cout << b->shift() << std::endl;
system("PAUSE");
return 0;
}