Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 27. únor 2010, 18:32:04 Předmět: virtual funkcia v konstruktore |
|
|
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. je nejaka moznost ako volat virtualne funkcie zvnutra samotnej triedy? _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 27. únor 2010, 18:37:02 Předmět: |
|
|
IMHO nelze volat takhle virtualni metody v construktorech a destructorech |
|
Návrat nahoru |
|
 |
Hardwire
Založen: 04. 09. 2007 Příspěvky: 117
|
Zaslal: 28. únor 2010, 01:15:22 Předmět: |
|
|
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 |
|
 |
Hardwire
Založen: 04. 09. 2007 Příspěvky: 117
|
Zaslal: 28. únor 2010, 01:22:45 Předmět: |
|
|
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 28. únor 2010, 08:44:15 Předmět: |
|
|
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 |
|
 |
|
|
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