Stránka 1 z 1

C++/Delphi + virtuální metody

Napsal: sob 2. pro 2006, 15:40
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áš

Napsal: ned 3. pro 2006, 14:31
od Rejp
Já ani nevim, čim se virtuální liší od normálních...

Napsal: ned 3. pro 2006, 14:49
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