Copy Konstruktor bei Vererbung

OP #4991851
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
Gast #4991862
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.
Gast #4991880
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
}
#4991931
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?
#4992019
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.
Gast #4992290
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;}
};
Gast #4992564
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.
Gast #4992567
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren