klasa kontener dla obiektow klas pochodnych

0

Witam

mam taki problem. Storzylem klase Baza, bedaca podstawa dla kolejnych klasy takich jak plyta,film,ksiazka itd. W klasie Baza mam funkcje wirtualna wyswietl, ktora jest w kazdej klasie pochodnej odpoiwednio zmodyfikowana o parametry ktore nie wystepuja w innych (np w plycie jest liczbaUtworow, a w filmie glAktor). Potrzebuje teraz stworzyc klase kontener, ktora bedzie przechowywac dane o obiektach klas pochodnych. Chcialem do tego celu wykorzystac klase vector. Ale jezeli jako typ tego vectora podam klase podstawowa to nie dziala mi wywolania funkcji wyswietl dla poszczegolnych obiektow klas pochodnych. Pracujac na danym elemencie tab uruchamia sie funkcja z klasy podstawowej, a nie funkcja konkretnego obiektu, czyli np dla obiektu ksiazka nie uruchamia sie funkcja wysiwetl z klasy ksiazka, tylko wyswietl z klasy Baza. Da to sie jakos ominac czy bede musial znalezc sobie inny kontener??

0

a wektor wskaźników do Baza nie jest tym czego szukasz? Bo polimorfizm działa tylko dla wskaźników i referencji! Wywołanie funkcji na obiekcie nie będzie wywołaniem polimorfizcznym.

0

Shalom ma na myśli użycie wskaźników i dynamiczną alokację z użyciem new:

vector<Baza*> tablica;
tablica.push_back(new Plyta());
tablica.back().Wyswietl();
0

Tak jak powiedział adf88 - powinieneś używać wskaźników, ale jeżeli chcesz uniknąć wycieków pamięci polecam użycie boost::shared_ptr

Jeśli chodzi o wywoływanie metod - być może nie zdefiniowałeś ich jako virtual? Bez tego zawsze będzie wywoływana metoda z klasy Base, a nie pochodnej.

Przykład:

#include <vector>
#include <iostream>
#include <boost/shared_ptr.hpp>

class Base
{

public:
	virtual void foo() { std::cout << "Base::foo" << std::endl; };
	void bar() { std::cout << "Base::bar" << std::endl; };

	virtual ~Base() { std::cout << "Base::~Base" << std::endl; };

}; // class Base

class Derived
{

public:
	virtual void foo() { std::cout << "Derived::foo" << std::endl; }
	void bar() { std::cout << "Derived::bar" << std::endl; };

	virtual ~Derived() { std::cout << "Derived::~Derived" << std::endl; }

}; // class Derived

typedef std::vector<boost::shared_ptr<Base> > FooCollection;

int main()
{

	FooCollection collection;

	collection.push_back(new Base());
	collection.push_back(new Derived());

	for(FooCollection::iterator iter = collection.begin(); iter != collection.end(); iter++)
	{
		(*iter)->foo();
		(*iter)->bar();
	};

}

Output:

Base::foo
Base::bar
Derived::foo
Base::bar
Base::~Base
Derived::~Derived

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