Dziedziczenie klas, identyczna metoda w 2 klasach - pogubiłem się :E

Odpowiedz Nowy wątek
2011-08-31 13:50
taki sobie luek
0

No więc tak:
W bibliotece są klasy A B C
B i C dziedziczą z klasy A
teraz stworzyłem klasę D, która dziedziczy z B
teraz stworzyłem klasę E, która dziedziczy z klasy D oraz C
i kiedy wywołuję metodę z klasy A oczywiście dostaję błąd bo kompilator nie wie z której klasy (D czy C) ma użyć metody

error: 'A' is an ambiguous base of 'E'

Jak temu zaradzić bo nie mam pojęcia ?

Pozostało 580 znaków

2011-08-31 13:56
0

A spróbuj wywołać tak eObject::D.kłopotliwaMetoda();


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2011-08-31 14:03
0

@autor metody to pół biedy, a co z duplikującymi się polami? Słowo klucz: wirtualne dziedziczenie. Dorzuć słówko virtual przy dziedziczeniu i powinno pomóc.

Pozostało 580 znaków

2011-08-31 16:47
0
#include <stdio.h>
 
#define CALL(a) printf("%s -> ",#a); a; printf("\n")
 
class A
{
public:
  void a()          { printf("A::a()"); }
  virtual void b()  { printf("A::b()"); }
};
 
class B: public A
{
public:
  void a()          { printf("B::a()"); }
  virtual void b()  { printf("B::b()"); }
};
 
class C: public A
{
public:
  void a()          { printf("C::a()"); }
  virtual void b()  { printf("C::b()"); }
};
 
int main()
{
  A* a = new A();
  A* b = new B();
  A* c = new C();
 
  CALL(a->a());
  CALL(a->b());
  printf("\n");
 
  CALL(b->a());
  CALL(b->b());
  CALL(dynamic_cast<B*>(b)->a());
  CALL(dynamic_cast<B*>(b)->b());
  printf("\n");
 
  CALL(c->a());
  CALL(c->b());
  CALL(((C*)c)->a());
  CALL(((C*)c)->b());
  printf("\n");
 
  delete a;
  delete b;
  delete c;
 
  return 0;
}

Wyjście:

a->a() -> A::a()
a->b() -> A::b()

b->a() -> A::a()
b->b() -> B::b()
dynamic_cast<B*>(b)->a() -> B::a()
dynamic_cast<B*>(b)->b() -> B::b()

c->a() -> A::a()
c->b() -> C::b()
((C*)c)->a() -> C::a()
((C*)c)->b() -> C::b()

można zrobić również coś takiego:

C c;
c.A::a();
c.A::b();

░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2011-08-31 16:50

Pozostało 580 znaków

2011-09-03 21:33
0
taki sobie luek napisał(a)

No więc tak:
W bibliotece są klasy A B C
B i C dziedziczą z klasy A
teraz stworzyłem klasę D, która dziedziczy z B
teraz stworzyłem klasę E, która dziedziczy z klasy D oraz C
i kiedy wywołuję metodę z klasy A oczywiście dostaję błąd bo kompilator nie wie z której klasy (D czy C) ma użyć metody

error: 'A' is an ambiguous base of 'E'

Jak temu zaradzić bo nie mam pojęcia ?

Inni udzielili odpowiedź jak uzyskać to co chcesz stworzyć, ja ze swojej strony mogę napisać, że jeśli powstaje taka hierarchia dziedziczenia to najprawdopodobniej jest gdzieś błąd koncepcyjny. Warto wtedy przeprojektować obiekty i posiłkować się np. wzorcem dekorator lub kompozyt.


Jeśli uważasz mój post za wartościowy - daj punkt.
Mój post pomógł Ci rozwiązać problem - zaznacz go.

Pozdrawiam

Pozostało 580 znaków

2011-09-03 21:45
0

poczytaj o problemie "diamond of death"

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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