Avatar billede dehdar Nybegynder
18. april 2008 - 14:52 Der er 7 kommentarer og
1 løsning

Spørgsmål om Arv

Hej, jeg har et spørgsmål til følgende eksempel. Jeg har to klasser, en klasse motor og en klasse bil.

class motor{
public:
motor(motor&);
private:
int a;
int b;
int c;
};

class bil : public motor{
public:
private:
int d;
};

Som det kan ses foroven arver klassen bil en motor. Så vidt jeg husker er reglerne, at det eneste man ikke kan arve fra en anden klasse er: constructor, destructor, assignment overload og copy constructor.

Når jeg så i mit program skriver følgende, så vil jeg mene det kun er den del, som er arvet, som burde blive håndteret af copyconstructoren. Dvs variablerne a b og c. Men nej, variablen d som kun eksisterer i klassen bil, som ikke har en copyconstructor bliver også håndteret af copyconstructoren! Er der nogen som kan forklare hvordan det kan lade sig gøre eller bare sende et link?

bil aa;
bil ab(aa);

På forhånd tak.
Avatar billede arne_v Ekspert
18. april 2008 - 15:07 #1
??

En default copy constructor laver mig bekendt en memcpy af "daz ganze molevitten" d.v.s.
alle felter uanset hvor de kommer fra.

Hvis du laver din egen copy constructur styrer du det selv.
Avatar billede arne_v Ekspert
18. april 2008 - 15:13 #2
Ioevrigt: klassen bilmotor kan arve fra klassen motor, men klassen bil kan ikke arve fra
klassen motor.

is a <> has a
Avatar billede dehdar Nybegynder
18. april 2008 - 15:13 #3
findes der en default copy constructor? øv... det havde jeg ingen anelse om. Jeg havde læst, at hvis man ikke implementerede copy constructoren, så vil compileren selv generere en ved "bitwise copying", men det vil sige at når compileren selv genererer en, så tager den simpelthen hånd om alle de medlemsdata, som klassen indeholder? Genialt.

Tak for det. Du må gerne ligge et svar.
Avatar billede dehdar Nybegynder
18. april 2008 - 15:31 #4
"Ioevrigt: klassen bilmotor kan arve fra klassen motor, men klassen bil kan ikke arve fra klassen motor."

Ja det rigtigt :) Det var ikke et specielt gennemtænkt eksempel, for så skulle det have været komposition.
Avatar billede arne_v Ekspert
18. april 2008 - 15:59 #5
Ikke specielt genialt. Proev og lav en klasse som indeholder pointere og ikke
har en copy constructor og assignment operator. Saa skal du see crashes.

Og svar.
Avatar billede dehdar Nybegynder
18. april 2008 - 16:21 #6
Følgende compilerer fint.

#pragma once
#include <iostream>
using namespace std;

class test
{
public:
    test();
    void setX( char* );
    void print();
private:
    char* x;
};

#include "test.h"

test::test()
{
    x = new char[10];
    strcpy(x, "default");
}

void test::setX( char* sX )
{
    delete [] x;
    x = new char[ strlen(sX) + 1 ];
    strcpy( x, sX );
}

void test::print()
{
    cout << x << endl << endl;
}

#include "test.h"

int main()
{
    test Obj;

    Obj.print();
    Obj.setX( "abcdefg hijklm" );

    test sss(Obj);

    sss.print();
    sss.setX( "123 45" );
    sss.print();

    cout << endl;

    return 0;
}
Avatar billede dehdar Nybegynder
18. april 2008 - 16:23 #7
orv med pointer mente du sikkert pointer association :)
Avatar billede arne_v Ekspert
18. april 2008 - 16:49 #8
Proev at ret main til:

#include "test.h"

int main()
{
    test Obj;

    Obj.print();
    Obj.setX( "abcdefg hijklm" );

    test sss(Obj);

    sss.print();
    sss.setX( "123 45" );
    sss.print();
    Obj.print(); // <--------------- ny linie

    cout << endl;

    return 0;
}
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