.[ ČeskéHry.cz ].
virtual funkcia v konstruktore

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 27. únor 2010, 18:32:04    Předmět: virtual funkcia v konstruktore Odpovědět s citátem

potreboval by som dosiahnut nieco taketo.
kód:
class A
{
    public:
    A()
    {
        cout << "konstruktor A" << endl;
        //b();
    }
    void b()
    {
        a();
    }
    virtual void a() = 0;
};

class B : public A
{
    public:
    void a()
    {
        cout << "a" << endl;
    }
};

problem je ze ak odkomentujem b() tak dostanem pri spusteni vynimku o volani pure function. ale ak zavolam ->b() uz na vytvorenenom objekte tak to bezproblemov funguje. Question je nejaka moznost ako volat virtualne funkcie zvnutra samotnej triedy?
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 27. únor 2010, 18:37:02    Předmět: Odpovědět s citátem

IMHO nelze volat takhle virtualni metody v construktorech a destructorech
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Hardwire



Založen: 04. 09. 2007
Příspěvky: 117

PříspěvekZaslal: 28. únor 2010, 01:15:22    Předmět: Odpovědět s citátem

Protoze B dedi od A, tak pri konstrukci B se nejdriv konstruuje A. V tom momente ale B jeste nestihlo do tabulky virtualnich metod nastavit pointery na svoje funkce, takze tam jsou pointery na funkce A. Kdyz se v ctoru A zavola nektera z techhle funkci, pouzijou se metody A.

Ty vyjimky se muzes zbavit tak, ze void a() das nejaky (treba prazdny) telo. Nicmene bude se volat A::a(), coz asi nechces. Jina moznost je volat b() az z ctoru B.

Vice info tady: http://support.microsoft.com/kb/125749/en-us
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Hardwire



Založen: 04. 09. 2007
Příspěvky: 117

PříspěvekZaslal: 28. únor 2010, 01:22:45    Předmět: Odpovědět s citátem

BTW tohle chovani si snadno muzes overit napr. ve Visual Studiu. Kdyz breaknu v ctoru A, tak vidim tohle:
kód:

this   0x0012ff60
   __vfptr   0x00417800 const A::`vftable'
      [0]   0x004112a8 A::b(void)
      [1]   0x0041129e A::a(void)

A kdyz breaknu v ctoru B, tak vidim tohle:
kód:

this   0x0012ff60
   __vfptr   0x00417a94 const B::`vftable'
      [0]   0x004112a8 A::b(void)
      [1]   0x0041116d B::a(void)



Z toho je videt, ze v ctoru A je __vfptr jeste nastavenej na vftable pro A, zatimco v ctoru B je __vfptr uz nastavenej na vftable pro B.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 28. únor 2010, 08:44:15    Předmět: Odpovědět s citátem

Hardwire napsal:
Protoze B dedi od A, tak pri konstrukci B se nejdriv konstruuje A. V tom momente ale B jeste nestihlo do tabulky virtualnich metod nastavit pointery na svoje funkce, takze tam jsou pointery na funkce A. Kdyz se v ctoru A zavola nektera z techhle funkci, pouzijou se metody A.

mam taky pocit ze v destruktore bude prave naopak a destruktor B zase odnastavy vtable takze v destruktoru A bude zase povodny stav.
Hardwire napsal:
Ty vyjimky se muzes zbavit tak, ze void a() das nejaky (treba prazdny) telo. Nicmene bude se volat A::a(), coz asi nechces. Jina moznost je volat b() az z ctoru B.

hej to som skusal ale to nie je to co chem. diki zase som sa naucil nieco o C++
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna