Article View: be.comp.programming
Article #9279Re: C leren voor C++
From: Nicolas Barbier
Date: Wed, 22 May 2002 08:19
Date: Wed, 22 May 2002 08:19
70 lines
2756 bytes
2756 bytes
LuWi <no@mail.com> wrote in message news:<5s8tdu8c6coe90esj0lvfuo0m3d0bammnt@4ax.com>...
> Dan moet je mij toch eens uitleggen hoe je polymorfisme en overerving
> doet in c :-)
er is 1 groot probleem (onvolkomenheid?) in C om dit op een perfect
vergelijkbare manier als in C++ te doen, nl: als je een pointer to
<type> hebt, kan je er niet een pointer to <struct containing a member
of type <type>> van maken (zover ik weet gaat dat in ansi C toch niet,
vertel het me als je een manier weet (zonder undefined behaviour plz
:-)).
stel je hebt dus een struct A en een struct B en je wil de situatie
"class B is een afgeleide van class A" nadoen. voor late binding heb
je dan dus een soort pointer nodig waarvan je zowel "pointer to struct
A" als "pointer to struct B" van kan maken. de manier die mij nog het
beste lijkt is om een extra struct te maken:
struct A_en_al_zijn_afgeleiden_gemeenschappelijk {
void *object;
struct vtable_voor_A vtable;
};
een aanroep van de "class A"-functie blabla werkt dan als volgt:
AofBpointer->vtable->blabla(AofBpointer/*->object*/, ...);
(AofBpointer is een (struct A_en_al_zijn_afgeleiden_gemeenschappelijk
*))
blabla moet dit dan ofwel naar (struct B *) ofwel naar (struct A *)
casten, afhankelijk van over welk run-time type het hier gaat (en dat
is dus bepaald door de creatie (dmv een "constructor") van het
"object", die de vtable moet initialiseren)
stel je had de pointer-operatie die ik in het begin vermelde dan kan
dit op een veel logischere manier (nl _perfect_ de manier waarop dit
in de meeste compilers bij C++ gebeurt) gekund.
overtuigd dat polymorphisme en evererving mogelijk zijn in C ? :-)
--
Nicolas Barbier
de niet-C++-gebruiker :-) (meestal toch niet)
Technical Details
Message-ID:
<2289cd62.0205220019.198ef2f8@posting.google.com>Path:
arc1-ca.pugleaf.net!archiver1.google.com!postnews1.google.com!not-for-mailReferences:
<3CB84721.8A420CAD@pandora.be> <jG%t8.15774$Ze.3708@afrodite.telenet-ops.be> <85661ul9w8.fsf@frit.mine.nu> <5s8tdu8c6coe90esj0lvfuo0m3d0bammnt@4ax.com>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: fcea4,643108e417cc4f0f X-Google-Attributes: gidfcea4,public X-Google-ArrivalTime: 2002-05-22 01:19:24 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!postnews1.google.com!not-for-mail From: brolemail@yahoo.com (Nicolas Barbier) Newsgroups: be.comp.programming Subject: Re: C leren voor C++ Date: 22 May 2002 01:19:24 -0700 Organization: http://groups.google.com/ Lines: 70 Message-ID: <2289cd62.0205220019.198ef2f8@posting.google.com> References: <3CB84721.8A420CAD@pandora.be> <jG%t8.15774$Ze.3708@afrodite.telenet-ops.be> <85661ul9w8.fsf@frit.mine.nu> <5s8tdu8c6coe90esj0lvfuo0m3d0bammnt@4ax.com> NNTP-Posting-Host: 213.224.83.46 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Trace: posting.google.com 1022055564 13767 127.0.0.1 (22 May 2002 08:19:24 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: 22 May 2002 08:19:24 GMT