public:
virtual void Drukujlnt(void) = 0;
};
dass Pochodna : public Interfejsl, public Interfejs2
private:
int m_i; float m_f1; float m_f2; public:
PochodnaO : m_i(0), m_f1(0.0f), m_f2(0.555f)
void Drukujlnt(void)
printf("%d ", m_i);
};
void TestABC(void)
Pochodna d;
Interfejsl *pif1 = &d;
Interfejs2 *pif2 = &d; d.Drukujlnt(); pif1 ->Drukujlnt(); pif2->Drukujlnt();
Klasa Pochodna dziedziczy po dwóch klasach podstawowych. Obie te klasy podstawowe definiują metodę Drukujlnt. Można zatem pomyśleć, że instrukcja d.DrukujInt() jest niejednoznaczna. W rzeczywistości jednak nie ma tu niejednoznaczności, ponieważ metody Drukujlnt w klasie Interfejsl i w klasie Interfejs2 są czystymi metodami wirtualnymi.
Przyjrzyjmy się, jak wygląda kod wygenerowany przez kompilator. Zaczniemy od metody Drukujlnt w klasie Pochodna:
44: |
void Drukujlnt(void) | |
45: |
{ | |
00401550 |
push |
ebp |
00401551 |
mov |
ebp.esp |
00401553 |
push |
ecx |
00401554 |
mov |
dword ptr [ebp-4],ecx |
46: |
printf("%d ", m_i); | |
00401557 |
mov |
eax,dword ptr [this] |
0040155A |
mov |
ecx,dword ptr [eax+8] |