Gå til innhold

Abstrakt klasse, arv og funksjonsdeklarering


Anbefalte innlegg

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 av Fjoggen
Lenke til kommentar
Videoannonse
Annonse

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 av Fjoggen
Lenke til kommentar

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 av alfred97
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...