Indem Sie ctor und die Zuweisung privat machen (oder sie in C ++ 11 als = delete deklarieren), deaktivieren Sie die Kopie.
Der Punkt hier ist, wo Sie das tun müssen. Um bei Ihrem Code zu bleiben, ist IAbstract kein Problem. (Beachten Sie, dass Sie bei dem, was Sie getan haben, das *a1
IAbstract
Unterobjekt a2 zuweisen und dabei keinen Verweis auf verlieren Derived
. Die Wertzuweisung ist nicht polymorph.)
Das Problem kommt mit Derived::theproblem
. Das Kopieren eines Abgeleiteten in ein anderes kann tatsächlich die *theproblem
Daten gemeinsam nutzen, die möglicherweise nicht für die gemeinsame Nutzung ausgelegt sind (es gibt zwei Instanzen, die delete theproblem
ihren Destruktor aufrufen können).
Wenn dies der Fall ist Derived
, muss dies nicht kopierbar und nicht zuweisbar sein. Wenn Sie die Kopie privat machen, kann sie natürlich auch nicht kopiert werden IAbstract
, da die Standardkopie sie Derived
benötigt Derived
. Wenn Sie jedoch Ihre eigenen definieren, Derived::Derived(const Derived&)
ohne IAbtract
copy aufzurufen , können Sie sie dennoch kopieren.
Das Problem befindet sich in Abgeleitet, und die Lösung muss in Abgeleitet bleiben: Wenn es sich um ein Nur-Dynamik-Objekt handeln muss, auf das nur über Zeiger oder Referenzen zugegriffen werden kann, muss es Abgeleitet sein
class Derived
{
...
Derived(const Derived&) = delete;
Derived& operator=(const Derived&) = delete;
};
Im Wesentlichen ist es theproblem
Sache des Designers der Klasse Derived (der wissen sollte, wie Derived funktioniert und wie verwaltet wird), zu entscheiden, was mit Zuweisung und Kopieren geschehen soll.