Bliższe pokrewieństwo a wieloznaczność

0

Witam. Chciałem sobie przetestować na prostym programie wieloznaczność. Mam klasy A, B w klasie A jest zmienna o nazwie a, klasa C dziedziczy po klasach A i B, klasa D jest osobną klasą i również posiada zmienna o nazwie a, klasa E dziedziczy po klasach C i D.
I teraz próbuję z klasy E odwołać się do zmiennej a np. tak:

void E::wypisz()
{
    cout << a << " " << b << " " << c <<  " " << e << endl;
}

I kompilator sygnalizuje mi, że zmienna a jest dwuznaczna. Czemu? Przecież do klasy D gdzie zadeklarowana jest zmienna a, klasa E ma bliższą drogę niż do klasy A, w której także jest zadeklarowana zmienna a. Tutaj taki obrazek zrobiony na szybko w paincie, żeby zobrazować jak to wygląda i o co mi chodzi:

http://imageshack.us/photo/my-images/100/64873502.jpg/

I kod programu, gdyby komuś chciało się analizować:

#include <iostream>
#include <string>
using namespace std;

class A
{
public:
    int a;
    A(int x) {a = x;};
    void wypisz();
};

class B
{
public:
    int b;
    B(int x) {b = x;};
    void wypisz();
};

class C : public A, public B
{
public:
    int c;
    C(int x, int y, int z) : A(x), B(y) {c = z;};
    void wypisz();
};

class D
{
public:
    int a;
    D(int x) {a = x;};
    void wypisz();
};

class E : public C, public D
{
public:
    int e;
    E(int z, int y, int v, int w, int x) : C(z, y, v), D(w) {e = x;};
    void wypisz();
};

void A::wypisz()
{
    cout << a << endl;
}

void B::wypisz()
{
    cout << b << endl;
}

void C::wypisz()
{
    cout << a << " " << b << " " << c << endl;
}

void D::wypisz()
{
    cout << a << endl;
}

void E::wypisz()
{
    cout << a << " " << b << " " << c <<  " " << e << endl;
}

int main(void)
{
    A a(4);
    B b(6);
    C c(10, 14, 100);
    D d(150);
    E e(1, 2, 3, 4, 5);

    a.wypisz();
    b.wypisz();
    c.wypisz();
    d.wypisz();
    e.wypisz();
    cin.get();
    cin.get();
    return 0;
}
1

C dziedziczy po klasie A i B, czyli klasa C dziedziczy zmienną a
klasa E dziedziczy po klasie C(zamiera zmienną a) i po D(też zawiera zmienną a)
prościej nie umiem :)

1

@olek1 a kto ci powiedział ze kogokolwiek obchodzi do której dziedziczonej instancji danej zmiennej klasa ma bliżej? o_O To nie ma absolutnie żadnego znaczenia. Dziedziczysz ją 2 razy i musisz coś z tym zrobić. Albo wyspecyfikujesz która cię interesuje, albo będziesz dziedziczył wirtualnie.

0

Ok. Już chyba mniej więcej doszedłem o co chodzi. Zmylił mnie rozdział w symfonii o bliższym pokrewieństwie, który troszkę źle zrozumiałem.

0

To znaczy, że masz starą wersję symfonii, bo w nowej jest napisane, że "Jest wieloznaczność! Co prawda droga do nazwy a w klasie podstawowej matka jest wyraźnie krótsza, niż droga do identycznej nzwy w klasie dziadek, ale to 'bliższe pokrewieństwo' nie ma znaczenia". Jest jeszcze notka "Uwaga: w dawnych wersjach języka C++ była tu różnica".

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