Aktuality  |  Články  |  Recenze
Doporučení  |  Diskuze
Grafické karty a hry  |  Procesory
Storage a RAM
Monitory  |  Ostatní
Akumulátory, EV
Robotika, AI
Průzkum vesmíru
Digimanie  |  TV Freak  |  Svět mobilně

C++ Builder/Delphi + virtuální metody

Logout (4018)|2.12.2006 15:45
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áš