Overriding virtual protected z pointeru třídy – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Overriding virtual protected z pointeru třídy – C / C++ – Fórum – Programujte.comOverriding virtual protected z pointeru třídy – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Hunty
~ Anonymní uživatel
48 příspěvků
10. 3. 2016   #1
-
0
-

Ahoj,
dostal jsem se k řešení problému při overridingu virtuální metody třídy, kterou znám jen jako pointer. Pro upřesnění uvedu příklad. 

class A
{
public:
    A(){};

    char getName()
    {
        return randomFunction();
    }

protected:
    virtual char randomFunction()
    {
        return 'A';
    }
};

class B: public A
{
protected:
    char randomFunction()
    {
        return 'B';
    }

};


int main()
{
    A *a = new A();
    B *b =  a;
    cout << b->getName() << endl;
}

b->getName() by měl tedy vrátit 'B'. Problém je v tom, že se mi to ani nezkompiluje. Napíše mi to:

error: invalid conversion from 'A*' to 'B*' 
     B *b =  a;
             ^

Jelikož znám pouze pointer třídy A, která obsahuje virtuální funkci, jak je možné tuto virtuální funkci "přepsat"? Jedná se mi o způsob, jakým lze přepsat virtuální funkce poiterů tříd, nehledám odpověď typu:


Když budeš mít kód:
B b;
cout << b.getName();
Vypíše ti to 'B';

Doufám, že jsem svůj problém dostatečně vysvětlil.
Děkuji za rychlé odpovědi! :-)

Nahlásit jako SPAM
IP: 178.188.125.–
Reklama
Reklama
KIIV+42
God of flame
10. 3. 2016   #2
-
0
-

Ono to funguje trosku jinak:

#include <iostream>

using namespace std;

class A
{
public:
    A(){};

    char getName()
    {
        return randomFunction();
    }

protected:
    virtual char randomFunction()
    {
        return 'A';
    }
};

class B: public A
{
protected:
    virtual char randomFunction()
    {
        return 'B';
    }

};


int main()
{
    A *a = new B();
    cout << a->getName() << endl;
}

Do A muzes priradit pointer B, ale ne naopak

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Hunty
~ Anonymní uživatel
48 příspěvků
12. 3. 2016   #3
-
0
-

Děkuji za odpověď.  Ovšem, je vůbec možné nějakým způsobem přepsat virtuální metodu již vytvořeného objektu? Např. z důvodu omezení ztráty dat. Viz. níže.

#include <iostream>

using namespace std;

class A
{
public:
	int number;
	A() { number = 5; };

	void setNumber(int value)
	{
		number = value;
	}

	int getNumber()
	{
		return number;
	}
	char getName()
	{
		return randomFunction();
	}

protected:
	virtual char randomFunction()
	{
		return 'A';
	}
};

class B : public A
{
protected:
	virtual char randomFunction()
	{
		return 'B';
	}

};


int main()
{
	A *a = new A();
	a->setNumber(10);

	cout << a->getName() << "\t" << a->getNumber() << endl;
	
	a = new B();
	cout << a->getName() << "\t" << a->getNumber() << endl;

	cin.get();
	return 0;
}

Output:
A 10
B 5

Celkem pochybuji, že by to bylo možné jinak, než upraveným konstruktorem objektu, který by předeklaroval proměnné, ale třeba se pletu.

Nahlásit jako SPAM
IP: 185.22.125.–
KIIV+42
God of flame
13. 3. 2016   #4
-
0
-

#3 Hunty
vubec nechapu, co tim myslis... virtualni metody jsou od toho, abys mohl objekt downcastovat (priradit do pointeru/reference neceho z rodicu) a pokud ma rodic danou metodu taky, tak se zavola ta spravna, co patri tomu skutecnemu objektu.


No a to  "a = new B();"  vytvori novy objekt a prepise pointer na ten puvodni, takze si vytvoril akorat unik pameti, a s puvodnim objektem to nic spolecneho nema...
 

Nahlásit jako SPAM
IP: 94.113.92.–
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, 111 hostů

Moderátoři diskuze

 

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