Avatar billede tosssen Nybegynder
26. august 2002 - 10:45 Der er 10 kommentarer og
1 løsning

Nedarves virtuel funktionalitet automatisk?

Jeg vil bare gerne vide hvorvidt en funktion der er virtuel i en basisklasse også automatisk er virtuel i nedarvede klasser, selvom nøgleordet virtual ikke bruges i prototype/erklæring i de nedarvede klasser.
Avatar billede chries Nybegynder
26. august 2002 - 10:50 #1
den er automatisk "virtual" i de nedarvede. Det er ikke nødvendigt at skrive virtual for nedarvede metoder, der er virtual i base klassen. (men er god skik at gøre det)
Avatar billede tosssen Nybegynder
26. august 2002 - 10:55 #2
Tak! Så ideen i at skrive virtaul er altså indikere at den 'oprindelige' er virtuel.
Avatar billede soepro Nybegynder
26. august 2002 - 12:27 #3
Ja og "signalere" at man har tænkt sig at implementere den i den nedarvede klasse.

Jeg synes oftest jeg ser at virtual står i begge klassers prototype, mens det ikke står i implementeringen af metoden. (Og det virker også.)
Avatar billede tosssen Nybegynder
26. august 2002 - 12:44 #4
Vil det sige at hvis man ikke har tænkt sig at implementere den virtuelle funktion i en nedarvet klasse, men i en klasse længere nede i hierakiet, så bruger man kun virtual nøgleordet i basisklassen og den klasse i hierakiet, hvor man implementerer den.

Er det sådan du mener:

class BaseClass
{
protected:
  virtual void function();
};

class DerivedClass1 : public BaseClass
{
protected:
  void function();
};

class DerivedClass2 : public DerivedClass1
{
public:
  virtual void function();
};

void DerivedClass2::function()
{
  return;
}
Avatar billede chries Nybegynder
26. august 2002 - 13:27 #5
Det er helt op til dig selv (din kode standard). Den eneste der skal erklærers virtuel er den i base klassen.

ps. hvis du ikke vil implementere "function" i "DerivedClass1", kan du unlade at erklærer den. men det er optil dig, hvad du synes er bedst :-)

class DerivedClass1 : public BaseClass
{
protected:
};
Avatar billede tosssen Nybegynder
26. august 2002 - 14:05 #6
Tak. Jeg prøver bare at følge den kode standart som er mest almindelig for at min kode bliver så læselig som muligt ;-)
Avatar billede soepro Nybegynder
26. august 2002 - 15:27 #7
chries >> Du kan vel ikke lave prototype på den uden virtual i DerivedClass1 uden at implementere den i DerivedClass1 ! Ved virtualitet laves der altid det der kaldes sen binding, dvs. der er den "øverste" funktionsdefinition i klassehierakiet der udføres. (Med mindre der ikke er virtuel i "midten" måske ???)
Avatar billede chries Nybegynder
26. august 2002 - 15:49 #8
Jeg forstod ikke helt hvad du mener, men du har ret i at hvis man laver en prototype, skal man også lave implementeringen (uanset om den er virtuel eller ej. Er en base funktion virtuel, læser compiler alle nedarvede også om virtuel, uanset om det står der eller ej). De eneste to måder (jeg kender) man kan undgå at lave en implementering, er at lade være med at lave/erklærer prototypen i DerivedClass1, eller lave den pure virtuel.
Avatar billede tosssen Nybegynder
26. august 2002 - 16:08 #9
Vil det sige at jeg med min ikke-virtuelle prototype i DerivedClass1 er nødt til at lave en implementering

void DerivedClass1::function()
{
  return;
}

for så senere at implementere den igen.

I så fald er det da klart smartest at udelade prototypen eller skrive virtual foran.
Avatar billede soepro Nybegynder
27. august 2002 - 14:06 #10
tosssen >> Ja, det vil det sige. Hvis du ikke vil lave funktionen i DerivedClass1, skal du fjerne prototypen fra classe-definitionen.
Avatar billede tosssen Nybegynder
27. august 2002 - 14:12 #11
Opsummering:
Jeg har følgende muligheder hvis jeg ikke vil implementere function i DerivedClass1:

1:  Udelade den fra klassedefinitionen
2:  Skrive en prototype som er virtual eller pure virtual

Er det rigtigt? (Jeg håber I har tålmodighed til det her ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester