C++ Builder/Delphi + virtuální metody
Ahoj,
našel jsem následující bug v Boland C++ Builderu 6.
V následujícím programu
[code]
---------------------------------------------------------------
#include
class A
{
public:
virtual char* a()=0;
};
class B
{
public:
virtual char* b()=0;
};
class C:public TObject, public A
{
int rr;
public:
virtual char* a()
{return "A";};
};
class D:public C, public B
{
int dd;
virtual char* b()
{return "B";};
};
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
D* d=new D;
B* b=d;
char *result=b->b(); //Vrátí "A" !!!!!!!
delete d;
return 0;
}
[/code]
třída D přetypovaná na B nepředpokládá, že mezi ní a interfacem
B je již "přilepen" interface A - a asi proto pak přetypovaná na B
volá metody z VMT objektu A, nikoli B (tzn. volá metodu na
správném místě VMT, ale ve špatné VMT - ověřeno na
složitějším příkladě).
Celé se to takto chová, pouze pokud je base class pascalského typu,
nepodědím-li třídu C z TObject, chová se to tak jak má.
Nevíte někdo, jestli na to neexistuje nějaký patch či workaround
či tak?
Díky, hezký den,
Matyáš
našel jsem následující bug v Boland C++ Builderu 6.
V následujícím programu
[code]
---------------------------------------------------------------
#include
class A
{
public:
virtual char* a()=0;
};
class B
{
public:
virtual char* b()=0;
};
class C:public TObject, public A
{
int rr;
public:
virtual char* a()
{return "A";};
};
class D:public C, public B
{
int dd;
virtual char* b()
{return "B";};
};
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
D* d=new D;
B* b=d;
char *result=b->b(); //Vrátí "A" !!!!!!!
delete d;
return 0;
}
[/code]
třída D přetypovaná na B nepředpokládá, že mezi ní a interfacem
B je již "přilepen" interface A - a asi proto pak přetypovaná na B
volá metody z VMT objektu A, nikoli B (tzn. volá metodu na
správném místě VMT, ale ve špatné VMT - ověřeno na
složitějším příkladě).
Celé se to takto chová, pouze pokud je base class pascalského typu,
nepodědím-li třídu C z TObject, chová se to tak jak má.
Nevíte někdo, jestli na to neexistuje nějaký patch či workaround
či tak?
Díky, hezký den,
Matyáš