/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Nedarvede funktioner
Fra : Klaus Petersen


Dato : 17-01-04 00:13

Hej NG.

Betragt koden her:

#include <stdio.h>

class BaseClass
{
protected:
BaseClass () { printf ("BaseClass Construction\n"); };
virtual void BaseFunc () { printf ("BaseClass - BaseFunc\n"); };
virtual ~BaseClass () { printf ("BaseClass Destruction\n"); };
};

class DevivedClass : public BaseClass
{
public:
DevivedClass () { printf ("DevivedClass Construction\n"); };
void BaseFunc () {
printf ("DevivedClass - BaseFunc\n");
BaseClass::BaseFunc ();
};

~DevivedClass () { printf ("DevivedClass Destruction\n"); };
};

int main(int argc, char* argv[])
{
DevivedClass* dc = new DevivedClass ();
dc->BaseFunc ();
delete dc;
return 0;
}

Hvis man kører programmet, vil man finde ud af, at basisklassens constructor
kaldes automatisk når den afledte klasse skabes.

Ligeledes destrueres de begge 2 automatisk.

Er det muligt at få en almindelig funktion til at gøre det samme?
I eksemplet gør jeg det manuelt, men jeg vil gerne have den til at kalde
basisklassens version automatisk.

Klaus.



 
 
Mogens Hansen (17-01-2004)
Kommentar
Fra : Mogens Hansen


Dato : 17-01-04 00:19


"Klaus Petersen" <spectual2@getTOnet.dk> wrote:

[8<8<8<]
> Hvis man kører programmet, vil man finde ud af, at basisklassens
constructor
> kaldes automatisk når den afledte klasse skabes.
>
> Ligeledes destrueres de begge 2 automatisk.
>
> Er det muligt at få en almindelig funktion til at gøre det samme?
> I eksemplet gør jeg det manuelt, men jeg vil gerne have den til at kalde
> basisklassens version automatisk.

Nej.

Venlig hilsen

Mogens Hansen



Klaus Petersen (17-01-2004)
Kommentar
Fra : Klaus Petersen


Dato : 17-01-04 00:19

> Nej.

Tænkte jeg nok :o] Men skulle lige spørge for en sikkerheds skyld.



Nicolai Hansen (19-01-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 19-01-04 13:54

"Klaus Petersen" <spectual2@getTOnet.dk> wrote in message news:<0j_Nb.8207$tr5.186@news.get2net.dk>...
> > Nej.
>
> Tænkte jeg nok :o] Men skulle lige spørge for en sikkerheds skyld.

Det ville ellers være smart ikke?

Hvordan er det det er med nedarvning af constructors?
Hvis man har en default constructor Base::Base(), og en anden
constructor Base::Base(char *ting), nedarver klassen og begge
constructors, så vil den nye klasses "anden constructor" kalde default
constructoren i Base - er det ikke sådan? Og hvad er det tricket er
for at få kaldt den "rigtige" (dårligt udtryk)?

Mogens Hansen (19-01-2004)
Kommentar
Fra : Mogens Hansen


Dato : 19-01-04 14:37


"Nicolai Hansen" <nic@aub.dk> wrote:

[8<8<8<]
> Hvordan er det det er med nedarvning af constructors?

Constructorer bliver ikke nedarvet.
Default og copy-constructoren bliver genereret hvis:
* De ikke explicit er implementeret
* De bliver brugt
* De _kan_ genereres, ud fra basis-klassens tilsvarende

> Hvis man har en default constructor Base::Base(), og en anden
> constructor Base::Base(char *ting), nedarver klassen og begge
> constructors,

Nej

> så vil den nye klasses "anden constructor" kalde default
> constructoren i Base - er det ikke sådan?
> Og hvad er det tricket er
> for at få kaldt den "rigtige" (dårligt udtryk)?

Man angiver det explicit, eller bliver default constructoren kaldt:

Derived::Derived(double d) :
Base("DerivedTingParam")
{
}

Venlig hilsen

Mogens Hansen



Nicolai Hansen (19-01-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 19-01-04 16:45

> > Hvordan er det det er med nedarvning af constructors?
>
> Constructorer bliver ikke nedarvet.

Undskyld - dårligt ordvalg - min fejl. Jeg tror nok du forstod alligevel :)

> Default og copy-constructoren bliver genereret hvis:
> * De ikke explicit er implementeret
> * De bliver brugt
> * De _kan_ genereres, ud fra basis-klassens tilsvarende
>
> > Hvis man har en default constructor Base::Base(), og en anden
> > constructor Base::Base(char *ting), nedarver klassen og begge
> > constructors,
>
> Nej

Forstået på den måde at man har en anden klasse, som nedarver fra Base, og
som har de samme constructors.

> > så vil den nye klasses "anden constructor" kalde default
> > constructoren i Base - er det ikke sådan?
> > Og hvad er det tricket er
> > for at få kaldt den "rigtige" (dårligt udtryk)?
>
> Man angiver det explicit, eller bliver default constructoren kaldt:
>
> Derived::Derived(double d) :
> Base("DerivedTingParam")
> {
> }

Tak. Det er en af disse ting jeg godt ved, men aldrig kan huske når jeg skal
bruge det :)

Et tillægs spørgsmål: Kan man -på nogen måde- UNDGÅ at base klassens default
constructor bliver kaldt? (andet ved end selv at kalde en anden
constructor)?




Kent Friis (19-01-2004)
Kommentar
Fra : Kent Friis


Dato : 19-01-04 18:06

Den Mon, 19 Jan 2004 16:44:38 +0100 skrev Nicolai Hansen:
>> > Hvordan er det det er med nedarvning af constructors?
>>
>> Constructorer bliver ikke nedarvet.
>
>Undskyld - dårligt ordvalg - min fejl. Jeg tror nok du forstod alligevel :)
>
>> Default og copy-constructoren bliver genereret hvis:
>> * De ikke explicit er implementeret
>> * De bliver brugt
>> * De _kan_ genereres, ud fra basis-klassens tilsvarende
>>
>> > Hvis man har en default constructor Base::Base(), og en anden
>> > constructor Base::Base(char *ting), nedarver klassen og begge
>> > constructors,
>>
>> Nej
>
>Forstået på den måde at man har en anden klasse, som nedarver fra Base, og
>som har de samme constructors.
>
>> > så vil den nye klasses "anden constructor" kalde default
>> > constructoren i Base - er det ikke sådan?
>> > Og hvad er det tricket er
>> > for at få kaldt den "rigtige" (dårligt udtryk)?
>>
>> Man angiver det explicit, eller bliver default constructoren kaldt:
>>
>> Derived::Derived(double d) :
>> Base("DerivedTingParam")
>> {
>> }
>
>Tak. Det er en af disse ting jeg godt ved, men aldrig kan huske når jeg skal
>bruge det :)
>
>Et tillægs spørgsmål: Kan man -på nogen måde- UNDGÅ at base klassens default
>constructor bliver kaldt? (andet ved end selv at kalde en anden
>constructor)?

Ved at lade være med at arve fra den. Constructoren opretter objektet,
så uden constructor ikke noget object.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Mogens Hansen (19-01-2004)
Kommentar
Fra : Mogens Hansen


Dato : 19-01-04 18:28


"Nicolai Hansen" <nic@aub.dk> wrote:

[8<8<8<]
> Et tillægs spørgsmål: Kan man -på nogen måde- UNDGÅ at base klassens
default
> constructor bliver kaldt? (andet ved end selv at kalde en anden
> constructor)?

Hvis du laver een anden constructor og ikke selv laver default
constructoren, så eksisterer default constructoren ikke (og kan derfor ikke
kaldes).

Lidt relateret:
Somme tider ønsker man ikke at man kan lave kopier af et objekt (f.eks. et
bank konto objekt).
Det kan man gøre ved at erklære copy-constructoren com private og undlade at
implemere den.

Ved at erklære copy-constructoren private, forhindrer man compileren i selv
op lave den og man forhindrer at andre end klassen selv kan få adgang til
den.
Man vil altså få compiler fejl hvis man prøver at bruge den.

Ved at undlade at implemere den, vil man (typisk) få en linker fejl, hvis
klassen selv prøver at kalde den.

Venlig hilsen

Mogens Hansen



Nicolai Hansen (19-01-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 19-01-04 21:53

> Hvis du laver een anden constructor og ikke selv laver default
> constructoren, så eksisterer default constructoren ikke (og kan derfor
ikke
> kaldes).

Meeen, hvis man nu gerne vil ha en default constructor på Base klassen?
Jeg ved godt at man nok ikke ka få det hele, men man ka jo prøve O:)





Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408183
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste