aktlaus Skrevet 3. juli 2007 Del Skrevet 3. juli 2007 (endret) Hei, jeg har laget meg en base klasse Event som er abstrakt og dermed inneholder "ekte" virutelle funksjoner som: std::string& toString() = 0; Må man da redeklarere denne prototypen i klassene som arver den? Altså: class Base { public: virtual const int tall() = 0; }; class ArverBase : public Base { public: const int tall(); }; Deretter så kan tall bli implementert slik: const int ArverBase::tall() { return 5; } Grunnen til at jeg spør er at jeg ikke har funnet noe informasjon om emne og at jeg ikke får kompilert hvis jeg ikke gjør det slik. Noe jeg ikke skjønner da tall jo er definert i Base klassen. Edit: Emne fra Abstrakt klasse og arv til Abstrakt klasse, arv og funksjonsdeklarering Endret 3. juli 2007 av Fjoggen Lenke til kommentar
GeirGrusom Skrevet 3. juli 2007 Del Skrevet 3. juli 2007 du MÅ deklerare funksjonene i prototypen, men du trenger ikke skrive funksjonene på nytt. Hvis du ikke deklarerer funksjonene i prototypen, kan du få ganske snedige feil. Lenke til kommentar
Dead_Rabbit Skrevet 3. juli 2007 Del Skrevet 3. juli 2007 Og hvis du vil overlaste funksjonen, må du deklarere og definere den i subklassen, hvis du ikke vil at subklassen også skal bli en abstrakt klassen. Du trenger imidlertid ikke virtual foran deklarasjonen. Lenke til kommentar
aktlaus Skrevet 4. juli 2007 Forfatter Del Skrevet 4. juli 2007 (endret) Takk for svarene, men jeg skjønner ikke hvorfor C++ er designet slik. Det er da bortkastet å måtte redeklarere funksjonsprotypen i de arvede klassene når funskjonen er virtuel og abstrakt. Da må man jo implementere de uansett slik de er definert i den abstrakte base klassen. I mine øyne forsvinner jo da litt av vitsen da den arvede klassedeklareringen blir mye større en strengt tatt nødvendig.... Edit: Skrivefeil Endret 4. juli 2007 av Fjoggen Lenke til kommentar
GeirGrusom Skrevet 4. juli 2007 Del Skrevet 4. juli 2007 Tja, man kan lure på hvorfor ikke compileren fikser dette.... Lenke til kommentar
alfred97 Skrevet 8. juli 2007 Del Skrevet 8. juli 2007 (endret) Det har nok litt å gjøre med hvilken informasjon linkeren trenger, uten at jeg har satt meg godt nok inn i kompilator-/linker-oppbygning til at jeg kan gå i detalj på dette. Kan selvfølgelig være litt enig i at kompilatoren burde kunne gå inn og legge inn de "manglende" headerne implisitt, men personlig ser jeg det som et stort poeng med tanke på ryddighet og lesbarhet, at klassedeklarasjonen skal inneholde headerne til alle funksjoner som skal implementeres. :-) Endret 8. juli 2007 av alfred97 Lenke til kommentar
GeirGrusom Skrevet 9. juli 2007 Del Skrevet 9. juli 2007 Men det gir en åpning for en feil som kan være veldig vanskelig å finne ut av. Har fått problemer med dette før, at feil funksjoner ble kalt, og verdier ble ikke satt etc. Det kan komme hvis du f.eks. bytter ut en funksjon i grunnklassen, uten å selv manuelt oppdatere de andre klassene. Dette burde dette blitt fikset for deg, en av mange svakheter ved C++ spør du meg. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå