Referencja do obiektu innej klasy

0

Witam,
mam trzy klasy A, B i C. A jest klasą główną i zawiera zmienną int x, natomiast B i C są pochodnymi tej klasy (i dziedziczą x). I teraz muszę móc wykonać coś takiego:

C c;
B& b = c;

(Obecnie wywala to błąd: invalid initialization of reference of type 'B&' from expression of type 'C')
Wiem, że działałoby to gdyby C była pochodną B, ale w zadaniu raczej nie powinienem ingerować w strukturę hierarchii klas. Czy jest jakiś inny sposób na zrobienie tego? Jakaś konwersja/rzutowanie?

0

Poczytaj o rzutowaniu w gore klas. Jest to mozliwe, ale nie wiem co chcesz osiagnac. Zawsze mozesz tez przeciazyc operator=.

0

To co chcesz zrobić jest po prostu błędne. Czemu? Załóżmy że klasa B posiada dodatkowo jakieś pola a klasa C nie. Co się stanie jak zrobisz takie rzutowanie i odwołasz sie do danych których twój obiekt fizycznie nie posiada? No ale jeśli musisz to zawsze mozesz zrobić jakiś reinterpret_cast, ale wiedz że to co robisz jest złym pomysłem.

0
#include <iostream>

using namespace std;

class A
{
public:
    void foo(){cout << "A\n";}
};

class B
{
public:
    void foo(){cout <<"B\n";}
};


int main()
{
    A *a = new A;
    a->foo();
    B *b = reinterpret_cast<B*>(a);
    b->foo();
    cout << endl;
    return 0;
}

Nie powinno sie tak robic. No ale przyklad dziala.

0

Wiem, że mogę napisać:

B& b = reinterpret_cast<B&>(c);

I to będzie działać, ale chodzi o to, że ja mam main() podany i nie mogę go modyfikować, a natomiast mam napisać obsługujące go klasy. reinterpret_cast próbowałem użyć wewnątrz klasy i to mi nie wychodziło.

0

No to w takim razie łaskawie powiedz jakie jest polecenie...
Bo przecież możesz sobie przeładować operator= albo konstruktor kopiujący odpowiednio a w klasie C mieć na przykład obiekt B który w takim przypisaniu wykorzystasz. Sposobów jest cała masa, tylko trzeba wiedzieć jaki jest spodziewany efekt...

0

No to w skrócie powiedzmy, że coś takiego mam:

---main---
A a(5);
C c(4);
B& b = c;

a.pokaz();
c.pokaz();
b.pokaz();

---klasy---
class A {
   public:
      int x;
      A(int in) {x=in;}
      void pokaz() {
         cout<<x<<endl;
      }
}
class B : public A {
   public:
      B(int in) {x=in;}
      void pokaz() {
         A::pokaz();
         cout<<x<<endl;
      }
}
class C : public A {
   public:
      C(int in) {x=in;}
      void pokaz() {
         cout<<x<<endl;
         A::pokaz();
         cout<<x<<endl;
      }
} 
0

Tak:

B(const C&) {
   B::x=C::x;
}

Czy tak:

B(const C& c) {
   this->x=c.x;
}

Czy może jeszcze jakoś inaczej?
Bo w pierwszym przypadku dostaję błąd, że C nie jest typem bazowym dla B, natomiast w drugim w wiele różnych błędów (np. pierwszy: ISO C++ forbids declaration of 'C' with no type).

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