Wpis z mikrobloga

#c++ #cpp #informatyka #programowanie

Działam z klasami w C++. Jest klasa ryba i ptak, co dziedziczą po klasie zwierze.
Jest też klasa ptakoryb co dziedziczy po ptaku i rybie ale mam problem z dostaniem się do metody jedz() która jest zdefiniowana w klasie zwierze.

class Zwierze
{
public:
void jedz(){
cout<<"\nzjadam";
}
};

class Ptak : public Zwierze
{
public:
void lec(){
cout<<"\nlatam";
}
};

class Ryba : public Zwierze
{
public:
void plyn(){
cout<<"\nplywam";
}

void Zwierze::jedz();
};

class ptakoryb : public Ryba, public Ptak
{
public:
int zz;
};

int main()
{
ptakoryb pr;
pr.plyn();
pr.lec();
pr.jedz();

return 0;
}
  • 9
Jak piszesz class ptakoryb : public Ryba, public Ptak to robisz stwora który ma i pysk ryby i dziób ptasi (a bardziej technicznie - masz dwie kopie cech zwierzęcych w ptakorybie - jedne od ryby a drugie od ptaka). Inaczej je się pyskiem ryby a inaczzej dziobem. Kompilator nie wie którym z nich chcesz coś zjeść. Masz dwa wyjścia:
- możesz powiedzieć kompilatorowi (explicit) - zjedz dziobem poprzez pr.Ptak::jedz()
- albo możesz
public Ptak to robisz stwora który ma i pysk ryby i dziób ptasi (a bardziej technicznie - masz dwie kopie cech zwierzęcych w ptakorybie - jedne od ryby a drugie od ptaka).


@BeginEnd: Tak, właśnie to mam na myśli i chcę rozwiązać ten problem.
Myślę, że pr.Ptak::jedz() mnie na tą chwilę satysfakcjonuje ale faktycznie zagłębię się w wirtualne. Dzięki!
@defoxe: Koledzy Ci ładnie wyjaśnili. Ptakoryb nie jest Rybą i Ptakiem tylko posiada pewne ich cechy. Zarówno Ptak jak i Ryba są żywymi organizmami. Dziedzicząc po obydwu to tak jakbyś zawierał w Ptakorybie Ptaka i Rybę. Dlatego też odniesienie się poprzez pr::Ryba::zjedz() / pr::Ptak::zjedz() zadziała. Podobnym rozwiązaniem będzie wykorzystanie zawierania zamiast dziedziczenia czyli posiadania w sobie pól obiektów tych dwóch klas. Prawidłowo byłoby właśnie wykorzystać wirtualizacje gdzie metoda zjedz() przysłaniałaby metody
@AnonimoweLwiatko: Pomieszałeś metody wirtualne z dziedziczeniem wirtualnym.

Myślę, że pr.Ptak::jedz() mnie na tą chwilę satysfakcjonuje ale faktycznie zagłębię się w wirtualne. Dzięki!


@defoxe: Koniecznie - te dwa mechanizmy nie są wymienne. Oba niosą ze sobą odmienne sposoby działania twojego programu.
@BeginEnd: ???

Prawidłowo byłoby właśnie wykorzystać wirtualizacje gdzie metoda zjedz() przysłaniałaby metody Ptaka i Ryby.


@AnonimoweLwiatko: Jeżeli robisz class ptakoryb : public Ryba, public Ptak to zrobienie metody Zwierze::jedz() jako wirtualnej nic tu nie da bo skończysz dokładnie w tym samym miejscu czyli kompilator nie będzie wiedział którą metodę wirtualną wybrać. Musiałbyś zrobić class ptakoryb : public Ryba, public Ptak, public Zwierz. Chyba że o czymś innym myślimy ale