Forum: PC-Programmierung Copy Konstruktor bei Vererbung


von Daniel S. (dani2304)


Lesenswert?

Hallo,
hätte mal ne Frage zum Copy Konstruktor. Wenn ich zwei Klassen habe und 
die Klasse 1 (LKW) von der Klasse 2(Auto) die public Methoden erbt. Wie 
kann ich auf diese private Variablen zugreifen?
1
LKW::LKW(const LKW &original){
2
    anzTueren=original.anzTueren; //anzTueren ist in private von Klasse 2
3
}
- Bekomme jedoch die Fehlermeldung, dass Auto::anzTueren private ist.
Muss ich dann mit einem Pointer arbeiten? Oder wie funktioniert das?

Liebe Grüße

von Kaj (Gast)


Lesenswert?

Wie waere es mit einer oeffentlichen Methode um die Anzahl der Tueren zu 
bekommen?
1
class Auto {
2
public:
3
    int get_door_count() const {
4
        return door_count;
5
    }
6
7
private:
8
    int door_count;
9
};
Da kannst du die Methode dann ganz entspannt in der abgeleiteten Klasse 
aufrufen.

von guest (Gast)


Lesenswert?

Kaj schrieb:
> Wie waere es mit einer oeffentlichen Methode um die Anzahl der Tueren zu
> bekommen?

Nutzt garnichts! Im Copy-Konstuktor bräuchte er auch schreibenden 
Zugriff.
Macht aber eh keinen Sinn die Member der Basisklasse in der abgeleiteten 
zu kopieren, dafür ist die Basisklasse schließlich selbst zuständig. Man 
ruft einfach den Copy-Konstuktor der Basisklasse auf:
1
LKW::LKW(const LKW &original):Auto(original)
2
{
3
}

von Rolf M. (rmagnus)


Lesenswert?

Daniel S. schrieb:
> Hallo,
> hätte mal ne Frage zum Copy Konstruktor. Wenn ich zwei Klassen habe und
> die Klasse 1 (LKW) von der Klasse 2(Auto) die public Methoden erbt. Wie
> kann ich auf diese private Variablen zugreifen?

Gar nicht. Deshalb hast du sie ja private gemacht - damit außer der 
Klasse, in der sie definiert sind, niemand darauf zugreifen kann.


> LKW::LKW(const LKW &original){
>     anzTueren=original.anzTueren; //anzTueren ist in private von Klasse
> 2
> }

Wenn die Variable zu Auto gehört, warum wird das nicht im 
Copy-Konstruktor von Auto erledigt?

von Vlad T. (vlad_tepesch)


Lesenswert?

cleverer wäre es in der Basisklasse nur eine virtuelle Funktion zu 
definieren und in der Ableitung eine entsprechende Implementierung 
bereitzustellen.
1
class BasisCar{
2
public:
3
  virtual  int getDoorCount()const = 0;
4
5
};
6
7
class PKW: public BasisCar
8
{
9
public:
10
  int getDoorCount()const { return 4;}
11
}
12
13
class LKW: public BasisCar
14
{
15
public:
16
  int getDoorCount()const { return 2;}
17
}

alternativ könnte man sowas machen, fände ich besser:
1
class BasisCar{
2
3
public:
4
  int getDoorCount(){ return m_doorCount;}
5
6
  BasisCar(int doors = 1)
7
    : m_doorCount(doors)
8
  {}
9
10
protected:
11
  int m_doorCount;
12
13
};
14
15
class PKW: public BasisCar
16
{
17
public:
18
  PKW()
19
    : BasisCar(4)
20
  {}
21
}
22
23
class LKW: public BasisCar
24
{
25
public:
26
  LKW()
27
    : BasisCar(2)
28
  {}
29
}

Wobei ich die Türanzahl jetzt nicht so geeignet für dieses Beispiel 
finden.

: Bearbeitet durch User
von Josef K. (Gast)


Lesenswert?

Du musst den Copy Contructor der BasisKlasse aufrufen und sie muss sich 
um Das Kopieren kümmern. Die Variable door?count oder AnzTueren ist auch 
dort deklariert.

#include <iostream>
using namespace std;

class Fahrzeug
{
public:
    Fahrzeug() : doorscount(2) {cout << "CTR Fahrzeug" << endl;}
    Fahrzeug(const Fahrzeug &other)
    {
        this->doorscount=other.doorscount;
        cout << "Copy CTR Fahrzeug" << endl;

    }
    int doorsCount() const { return doorscount; }
    void setDoorsCount(int val ) { doorscount=val;}
private:
    int doorscount;
};

class Lkw : public Fahrzeug
{
public:
    Lkw() {}
    Lkw( const Lkw & other) : Fahrzeug(other)  { cout << "Copy CTR Lkw" 
<< endl;}
};

von Ing (Gast)


Lesenswert?

Daniel S. schrieb:
> Hallo,
> hätte mal ne Frage zum Copy Konstruktor. Wenn ich zwei Klassen habe und
> die Klasse 1 (LKW) von der Klasse 2(Auto) die public Methoden erbt. Wie
> kann ich auf diese private Variablen zugreifen?
> LKW::LKW(const LKW &original){
>     anzTueren=original.anzTueren; //anzTueren ist in private von Klasse
> 2
> }
> - Bekomme jedoch die Fehlermeldung, dass Auto::anzTueren private ist.
> Muss ich dann mit einem Pointer arbeiten? Oder wie funktioniert das?
>
> Liebe Grüße

Indem du die Member Variablen die du kopieren möchtest protected machst.
Auf private Variablen kannst du per Definition nicht in der abgeleiteten 
Klasse zugreifen, da haben meine Vorredner schon recht.

von Ing (Gast)


Lesenswert?

Josef K. Hat dem richtigen Ansatz eigentlich schon genannt, habe ihn nur 
überlesen. Normalerweise kümmert sich der Ctor der jeweiligen Klasse ums 
kopieren, du rufst also immer nur den Basisctor auf.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.