Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kontener na obiekt pochodne

Ostatnio zmodyfikowano 2016-03-31 21:01
Autor Wiadomość
emSon
Temat założony przez niniejszego użytkownika
Kontener na obiekt pochodne
» 2016-03-30 20:41:58
Cześć. Załóżmy że mam taki zestaw klas:

C/C++
class Baza
{
public:
    virtual void Metoda() = 0;
};

class PochodnaJeden
    : public Baza
{
public:
    virtual void Metoda();
};


class PochodnaDwa
    : public Baza
{
public:
    virtual void Metoda();
    void DodatkowaMetoda();
};

Czy istnieje możliwość umieszczenia obiektów klasy PochodnaJeden i PochodnaDwa w tym samym kontenerze?

I jeszcze jedno pytanko. Jeśli Baza ma ustawiony konstruktor, to czy muszę go wywoływać w klasie pochodnej?

C/C++
PochodnaJeden::PochodnaJeden()
    : Baza()
{
}
P-146797
michal11
» 2016-03-30 20:46:03
Jeżeli jest to konstruktor domyślny to nie musisz.

Najlepiej zrobić tak:
std::vector < std::unique_ptr < Baza >> vec;

oczywiście zakładając, że chcesz skorzystać z vectora.

Możesz też zrobić tak:
std::vector < Baza *> vec;

Tylko musisz pamiętać o poprawnym zwolnieniu wszystkich obiektów żeby nie mieć wycieku pamięci.
P-146799
emSon
Temat założony przez niniejszego użytkownika
» 2016-03-30 20:54:49
No ok, ale przy użyciu :

C/C++
m_obiekty[ 0 ]->DodatkowaMetoda();

wyświetla się


error: ‘class 'Bazowa’ has no member named ‘DodatkowaMetoda’
P-146802
michal11
» 2016-03-30 22:35:07
Nic dziwnego skoro nie ma takiej metody w klasie Baza, jeżeli musisz tak zrobić to znaczy, że masz źle zaprojektowaną hierarchię klas ew. źle zaprojektowane wykorzystanie kontenera.
P-146808
emSon
Temat założony przez niniejszego użytkownika
» 2016-03-31 21:01:51
Więc tak, w klasie którą tu nazywam PochodnaDwa miałem po prostu dodatkową flagę i Getter oraz Setter do niej. I już wiem, że da się tak zrobić:

C/C++
if( PochodnaDwa * ptr = dynamic_cast < PochodnaDwa *>( table[ i ] ) )
{
    ptr->DodatkowaMetoda();
}

P-146845
« 1 »
  Strona 1 z 1