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

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 ?

0

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

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.

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();
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.

0

poczytaj o problemie "diamond of death"

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