PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Vererbung, const& member



volatile
13-09-2013, 11:18
Hallo.

Ich muss etwas legacy Code um neue Klassen ergänzen. DataA und ContainerA sind gegeben, DataB und ContainerB müsser aus diesen abgeleitet werden. Die Idee ist im Code unten veranschaulicht. Natürlich ist es nicht kompilierbar, weil die Elternklasse einen const& Member enthält (die Tochterklasse tut es ebenfalls). Ist eine solche Vererbung überhaupt machbar ohne die Elternklassen zu manipulieren?
PS: vector und queue sind nur Beispiele, in Wirklichkeit sieht's etwas komplizierter aus.



#include <vector>
#include <queue>

class DataA
{
std::vector<int> dataA;
virtual void processData();
public:
DataA() { dataA.push_back(0); }
};

class DataB : public DataA
{
std::queue<int> dataB;
virtual void processData();
public:
DataB() {dataB.push(0);}
};


class ContainerA
{
DataA const& dA;
public:
ContainerA(DataA const& d) : dA(d) {}
};

class ContainerB : public ContainerA
{
DataB const& dB;
public:
ContainerB(DataB const& d) : dB(d) {}
};

int main()
{
DataB db;
ContainerB cb(db);
}

locus vivendi
14-09-2013, 13:39
Natürlich ist es nicht kompilierbar, weil die Elternklasse einen const& Member enthält (die Tochterklasse tut es ebenfalls).
Das verstehe ich nicht. Dein Code kompiliert nicht, weil du in "ContainerB" versuchst den Default-Constructor von "ContainerA" aufzurufen, welcher aber als gesperrt definiert ist ("is defined as deleted"). Rufe stattdessen den sebstdefinierten Konstruktor von ContainerA auf, und dein Code wird auch kompilieren.

Evtl. gibt es für dein eigentliches Programmierproblem ja noch eine einfachere Lösung. Wenn du erläuterst, wo das eigentliche Problem liegt, dann könnten vielleicht noch bessere Kommentare folgen.

anda_skoa
14-09-2013, 14:49
ContainerB(DataB const& d) : ContainerA(d), dB(d) {}


Beide Basisklassen sollten entweder den Destructor protected deklarieren oder virtual.

Ciao,
_