Ich schreibe gerade eine komplizierte Klasse und darin muss ich im Grunde eine Liste abgeleiteter Klassen kopieren. Die vereinfachte Version ist wie folgt: ich eine Basisklasse, von denen ich einige andere Klassen ableiten:C++ Zuweisungsoperator = Überladen mit abgeleiteten Klassen
class Base
{
public:
virtual void test(void)
{
cout << "Base" << endl;
}
Base(vector<Base*> *pointer)
{
pointer->push_back(this);
}
virtual Base& operator=(const Base& rhs)
{
cout << "Base=" << endl;
return *this;
}
};
class A : public Base
{
public:
void test(void)
{
cout << "A" << endl;
}
A(vector<Base*> *pointer) : Base(pointer) {}
A& operator=(const A& rhs)
{
cout << "A=" << endl;
return *this;
}
};
class B : public Base
{
public:
void test(void)
{
cout << "B" << endl;
}
B(vector<Base*> *pointer) : Base(pointer) {}
B& operator=(const B& rhs)
{
cout << "B=" << endl;
return *this;
}
};
Dann erstelle ich eine Liste von Objekten, die ich in der in einer Zeigerliste der Basisklasse speichern :
Diese Objekte sind mit den gleichen Klassen (gleiche Reihenfolge) I, in einer zweiten Liste will dann kopieren, aber die unterschiedlichen Werte haben könnte.
for (int i = 0; i < (int)listA.size(); i++)
{
(*listA[i]) = (*listB[i]);
}
Aber C++ ist nicht in der Lage, das zu tun. Da die Liste den Typ Base * hat, erstellt Dereferenzierung ein Objekt vom Typ Base. Daher wird der Zuweisungsoperator = der Base-Klasse anstelle der korrekten der abgeleiteten Klasse aufgerufen. Wie kann ich das beheben?
Oder wie kann ich C++ sagen, den richtigen Operator zu verwenden? Vielleicht von einigen isinstanceof-Funktion?
Für eine vollständige Probe siehe:
int main()
{
vector<Base*> listA;
new Base(&listA);
new A(&listA);
new B(&listA);
vector<Base*> listB;
new Base(&listB);
new A(&listB);
new B(&listB);
for (int i = 0; i < (int)listA.size(); i++)
{
(*listA[i]).test();
}
for (int i = 0; i < (int)listA.size(); i++)
{
(*listA[i]) = (*listB[i]);
}
}
Welche Ausgänge:
Base
A
B
Base=
Base=
Base=
Mögliches Duplikat von [Warum verwendet eine abgeleitete Klasse nicht den Basisklassenoperator = (Zuweisungsoperator)?] (Http://stackoverflow.com/questions/10838211/why-doesnt-a-derived-class-use) -the-base-class-Operator-Zuweisungsoperator? rq = 1) –
Was bedeutet es, ein "A" einem "B" zuzuweisen oder umgekehrt? – aschepler