Dědičnost - volání metody předka, nikoli potomka – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dědičnost - volání metody předka, nikoli potomka – C / C++ – Fórum – Programujte.comDědičnost - volání metody předka, nikoli potomka – C / C++ – Fórum – Programujte.com

 

Petr
~ Anonymní uživatel
746 příspěvků
21. 4. 2012   #1
-
0
-

Zdravím.

Snažím se vytvořit container obsahující instance třídy pro prvek a jejích potomků. Nejde ale o pole ukazatelů na instance, ale přímo o pole instancí, a v tom asi bude ten problém, nemohu to ale změnit... Třídu pro základní prvek abstraktní udělat nemůžu, to samozřejmě zařve...

Tu je kód:

class BaseItem
{
	public:

		virtual void Print(ostream & os) const
		{
			os << "BaseItem";
		}
};



class SpecialItem : public BaseItem
{
	public:

		virtual void Print(ostream & os) const
		{
			os << "SpecialItem";
		}
};



class Container
{
	public:

		Container(void)
		{
			m_Items = new BaseItem[200];
			m_Size = 0;
		}



		~Container(void)
		{
			delete [] m_Items;
		}



		Container & Insert(const BaseItem & item)
		{
			m_Items[ m_Size++ ] = item;
			return *this;
		}



		friend ostream & operator << (ostream & os, const Container & c)
		{
			for (int i = 0; i < c.m_Size; i++) {
				c.m_Items[i].Print(os);
			}

			return os;
		}



	protected:

		BaseItem * m_Items;
		int m_Size;
};

V mainu pak když vkládám jedn. instance a vypisuji, vždy se vypíše "BaseItem":

Container container;
container.Insert( BaseItem() ).Insert( SpecialItem() );
cout << container << endl; // BaseItemBaseItem

Existuje způsob, jak vynutit zavolání metody potomka?

Předem děkuji.

Nahlásit jako SPAM
IP: 90.176.199.–
yaqwsx+9
Posthunter
21. 4. 2012   #2
-
0
-

Kód jsem jen zběžně prolétl - dědičnost funguje jen na ukazatelích nebo referencích. Tzn. dynamicky alokované paměti pomocí new/delete se snadno nevyhneš. Z logiky věci - co když bude potomek větší? Jak ho uložíš do prostoru určeného pro rodiče?

Nejjednodušší je vytvořit si nějaký smart pointer a mít pole smart pointerů. Popř. pokud se nebráníš C++11, tak se podívej na třídy shared_ptr a unique_ptr.

Nahlásit jako SPAM
IP: 85.160.51.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
KIIV
~ Moderátor
+43
God of flame
21. 4. 2012   #3
-
0
-

v prve rade je problem v tom, ze new nad polem objektu zavola i konstruktory! To uz jen tak na jinou tridu nepredelas

delete [] zase nad vsema polozkama zavola destruktor...

pointerum se nemas sanci vyhnout

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 17 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý