C++, funkcje wirtualne + lista STL

Adaszeq
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 3 cze 2011, o 23:15
Płeć: Mężczyzna
Lokalizacja: Poznań
Podziękował: 1 raz

C++, funkcje wirtualne + lista STL

Post autor: Adaszeq »

Wypisałem tylko najważniejsze rzeczy bo kod jest za długi, a chodzi mi o konkretnie te rzeczy, więc może jakoś zorientujecie się ocb

-Mam zaimplementowaną listę z STL. list<bazowa>lista;

Kod: Zaznacz cały

class bazowa{
     public:
     virtual void procedura(){}
};

class pochodna1:public bazowa{
     public:
    pochodna1(){} 
    void procedura(){}
};

class pochodna2:public bazowa{
     public:
     pochodna2(){} 
     void procedura(){}
};


lista.push_back(pochodna1());
lista.push_back(pochodna2());
I teraz chcę teraz wybrać sobie jakiś element tej listy (wg. własnych kryteriów) i wykonać metodę, która jest konkretna i dla danej klasy pochodnej. Tzn. wstawiłem na listę obiekt klasy pochodnej1 i chce teraz wywołać jego funkcje procedura().

Próbowałem z iteratorami, ale coś nie tak jest bo widzi jedynie elementy klasy bazowe. Natomiast klasy pochodnej już nie ;>
Ostatnio zmieniony 4 cze 2011, o 09:48 przez Afish, łącznie zmieniany 2 razy.
Powód: Znaczniki [code]
Awatar użytkownika
argv
Użytkownik
Użytkownik
Posty: 569
Rejestracja: 27 maja 2009, o 01:27
Płeć: Mężczyzna
Podziękował: 51 razy
Pomógł: 66 razy

C++, funkcje wirtualne + lista STL

Post autor: argv »

Na początek przyjrzyj się poziomowi dostępu w klasie bazowej (i pochodnych też).-- 4 cze 2011, o 00:36 --Ok. Teraz zastosuj wskaźniki (wskaźnik do obiektu klasy pochodnej można przypisać do wskaźnika klasy bazowej) - dopiero wtedy polimorfizm zadziała.

Kod: Zaznacz cały

vector<bazowa *> lista;  lista.push_back(new pochodna1()); 
Adaszeq
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 3 cze 2011, o 23:15
Płeć: Mężczyzna
Lokalizacja: Poznań
Podziękował: 1 raz

C++, funkcje wirtualne + lista STL

Post autor: Adaszeq »

Dzięki generalnie walczyłem z tym ze 3h... byłem blisko a zaraz tak daleko A tu dla innych taki krótki kod używania wirtualnych funkcji z użyciem listy STL.

Kod: Zaznacz cały

#include <iostream> 
#include <list> 
using namespace std; 

class A { 
      public: 
      A(int a):zmienna(a){}        
      int zmienna;
      virtual void abc(){ 
              cout<<"Klasa A:";
              } 
      }; 

class B : public A 
{     public:
      B(int b):A(b){}
      
  void abc(){ 
       cout<<"Klasa B:";
       }    
}; 


int main() 
{ 
A a(10);B b(5);

//klasyczna wirtualnosc 
A *p; 
p=&a;p->abc(); 
p=&b;p->abc();  

cout<<endl<<endl; 

//A tu juz nie dziala 
list<A*> lista; 
lista.push_back(&a); 
lista.push_back(&b); 

for ( list<A*>::iterator it=lista.begin(); it!=lista.end(); ++it ) {
  (*it)->abc(); 
  cout <<(*it)->zmienna << endl; 
}

system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
ODPOWIEDZ