Dziedziczenie wirtualne

0

Witam!
Mam taki kod:

#include <iostream>

class Obiekt
{
public:
    void op(int a) {cout << "Metoda z klasy Obiekt\n";}
};

class wiekszy_Obiekt:virtual Obiekt
{
public:
    void op(int a) {cout << "Metoda z klasy wiekszy_Obiekt\n";}
};

class inny_Obiekt:virtual Obiekt { };

class super_Obiekt:public wiekszy_Obiekt, public inny_Obiekt { };

int main()
{
    super_Obiekt o;
    o.op(2);
}

W jaki sposób wywołać metodę z klasy Obiekt ?
Bo normalnie wywołuje mi się metoda z wiekszy_Obiekt, dlaczego ?

Pozdrawiam

0

Mozna np. zrzutowac na konkretny typ:

(static_cast<Obiekt>o).op();

0

o.Obiekt::op(2);

0

Bo normalnie wywołuje mi się metoda z wiekszy_Obiekt, dlaczego ?

poniewaz WiekszyObiekt dziedziczy po Obiekt i "przykrywa" ja swoja wersja tej metody... mowiac łopatologicznie: zmienna jest typu super_obiekt, ale on nie ma takiej metody. za to - dziedziczy po wiekszy_obiekt ktory ma taka metode, i ona sie wywoluje - kompilator juz nie szuka "glebiej" w drzewie dziedziczenia, skoro znalazl juz na tym poziomie..

sposob Krolika zadziala, poniewaz powoduje on chwilowe "przyciecie" obiektu do klasy bazowej Obiekt i dopiero wywolanie metody -- skoro teraz zmienna jest typu Obiekt, nie widac typow "nabudowanych na obiekcie", jest tutaj tylko bazowa metoda "op" - i ona sie wykona, dosc .. logiczne

sposob przypadkowego rowniez zadziala - tutaj to jest troche zawinieta skladnia, nalezy na to patrzec tak:
o. Obiekt::op (2)
czyli:
o wez zmienna op
. wywolaj
Obiekt::op metode "Obiekt::op", czyli "op" z przestrzeni/klasy "Obiekt"
(2) z argumentami..

1 użytkowników online, w tym zalogowanych: 0, gości: 1