Ich habe folgendes MWE Code:Virtuelle Zuweisungsoperator nicht static_cast ermöglicht
#include <algorithm>
class Base{
public:
int baseMember;
friend void swap(Base& in, Base& out)
{
using std::swap;
swap(in.baseMember, out.baseMember);
}
virtual Base& operator=(Base obj)
{
swap(*this, obj);
return *this;
}
Base() : baseMember(1)
{
}
};
class Derived : public Base
{
public:
int derivedMember;
friend void swap(Derived& in, Derived& out)
{
using std::swap;
swap(in.derivedMember, out.derivedMember);
swap(static_cast<Base&>(in), static_cast<Base&>(out));
}
virtual Base& operator=(Base obj)
{
swap(*this, static_cast<Derived&>(obj));
return *this;
}
Derived() : Base(), derivedMember(2)
{
}
};
int main()
{
Base *b1 = new Derived();
Base *b2 = new Derived();
*b1 = *b2;
delete b1;
delete b2;
}
Ich habe zwei Base
Zeiger zeigt auf Derived
Daten. Ich mache dann eine Zuordnung der Inhalte der Zeiger. Da der Zuweisungsoperator der Klasse Base
virtual
ist, tritt Polymorphismus ein und der Zuweisungsoperator der Klasse Derived
(mit der gleichen Signatur) wird stattdessen aufgerufen.
Die static_cast
Umwandlung der Quelle in ein Derived
Objekt schlägt jedoch fehl. Oder, naja, es wandelt es erfolgreich in ein Derived
Objekt um, aber sein derivedMember
ist Müll (nachdem es anfänglich im Konstruktor gesetzt wurde).
Wie kann dies vermieden werden? Wie kann eine Zuordnung zwischen dem Derived
Inhalt von zwei Base
Zeigern erfolgen?
Verwenden Sie 'dynamic_cast' stattdessen, es ist sicherer, weil es überprüft, ob die Referenz * wirklich * auf' Derived' Objekt bezieht. – PcAF