Lista przechowująca obiekty hierarchii

0

Witam.

Mam klasę Klasa_podstawowa i od tej klasy wywodzą się bezpośrednio 3 klasy pochodne.

Klasy pochodne dziedziczą wszystko w ten sam sposób od klasy podstawowej i każda z klasy pochodnej ma jakieś dodatkowe pola.

Utworzyłem strukturę 'element' przechowującą element klasy 'Klasa_podstawowa' oraz klasę 'Lista' przechowującą elementy struktury 'element'.

struct element
{
    Klasa_podstawowa el;
    element * next;
};

class Lista
{
    element * head;
    element * tail;

public:

    Lista() : head(NULL), tail(NULL) {}

    void dodaj(Klasa_podstawowa & elem)
    {
         element * temp;
         temp = new element;
         temp->el = elem;
         temp->next = NULL;

         if (!head)
             head = tail = temp;
         else
         { 
             temp->next = head;
             head = temp;
         }
    }

};

Wywołując funkcję dodaj dla argumentu Klasa_podstawowa, wszystko działa jak należy.
Wywołując funkcję dodaj i jako argument podając obiekt jednej z klas pochodnych, również nie ma błędu, na listę dodaje się obiekt, jednak dostęp jest tylko do tych elementów składowych które dziedziczy od klasy podstawowej.

Moje pytanie brzmi: Jak to wszystko skonstruować, aby wywołując funkcję dodaj() przy argumentach, którymi są obiekty klas pochodnych, dostęp był również do tych pól, które są nie odziedziczone, a utworzne dopiero na poziomie klasy pochodnej.

0

Ale po co? Przecież funkcji dodaj() nie obchodzą w ogóle dane przechowywane przez daną klasę?

Z tym ze ten twój kod jest błędny i nie zadziała tak jak byś chcial. Z tego powodu ze struktura element składa się ze wskaźnika i obiektu klasy podstawowej. Jeśli do tego obiektu przypiszesz obiekt klasy pochodnej, to zostanie "obcięty" i już.
Musiałbyś tutaj użyć wskaźnika zeby to przeskoczyć. A potem do odczytu pewnie funkcji wirtualnych, żeby rozróżniać jakiej klasy jest to obiekt.

0

OK, dzięki. Teraz działa.

struct element
{
    Klasa_podstawowa * el;
    element * next;
};

class Lista
{
    element * head;
    element * tail;

public:

    Lista() : head(NULL), tail(NULL) {}

    void dodaj(Klasa_podstawowa * elem)
    {
         element * temp;
         temp = new element;
         temp->el = elem;
         temp->next = NULL;

         if (!head)
             head = tail = temp;
         else
         { 
             temp->next = head;
             head = temp;
         }
    }

};

Zmieniłem, to co mówiłes. Czyli, teraz struktura 'element' zamiast obiektu zawiera wskaźnik na obiekt klasy podstawowej. Do odczytu używam funkcji wirtualnych, wszystko śmiga jak należy :)

Natomiast przy wywołaniu funkcji dodaj() muszę teraz wpisać argument poprzedzony '&'.

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