C++/Delphi + virtuální metody

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
logik
Nováček
Nováček
Registrován: 13. pro 2005

C++/Delphi + virtuální metody

Příspěvek od logik »

Ahoj,
našel jsem následující bug v Boland C++ Builderu 6.
V následujícím programu

Kód: Vybrat vše

---------------------------------------------------------------
#include<vcl.h>
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;
}
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áš
Rejp
Nováček
Nováček
Registrován: 20. lis 2006
Kontaktovat uživatele:

Příspěvek od Rejp »

Já ani nevim, čim se virtuální liší od normálních...
pavel.minarik
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 03. čer 2003
Bydliště: Brno
Kontaktovat uživatele:

Příspěvek od pavel.minarik »

Rejp píše:Já ani nevim, čim se virtuální liší od normálních...
tak to sem snad ani nepiš ne?!
virtuální metoda, je metoda, kterou implementuje až potomek odvozený od třídy, ve které je metoda implementována
co se týká toho dotazu, tak na to sem teda krátkej, ikdyž v Delphi prgramuju už několik let, zkusil bych fórum Borland community
Pavel Minarik @ Dell Latitude 7300 (bohužel moc topí, nedoporučuju)
Odpovědět

Zpět na „Programování a web“