Ich versuche eine Factory für abgeleitete Klassen zu erstellen. Ich möchte nur, dass die Factory Instanzen der abgeleiteten Klassen erstellen kann, also habe ich den Basiskonstruktor protected
; Die abgeleiteten Klassen verwenden nur die Basisklassenkonstruktoren, so dass ihre Konstruktoren auch protected
sind.
Ich habe versucht, die Factory als Freund der Basisklasse zu deklarieren, damit sie auf den Konstruktor protected
zugreifen kann. Wenn ich mit diesem Befehl kompiliere
Ich bekomme diesen Fehler:
%Vor% Zusammen mit einem ähnlichen Fehler für die abgeleitete Klasse B
.
Ich habe das Gefühl, andere Fragen auf stackoverflow.com zu lesen, dass das in C ++ 11 nicht möglich ist, aber ich bin mir nicht sicher warum. Kann jemand erklären, warum das nicht funktioniert und vielleicht eine Alternative?
Beispielcode
%Vor% Wenn Sie einen Konstruktor von einer Basisklasse erben, behält er den Zugriff des ursprünglichen Konstruktors bei, unabhängig davon, wo Sie die Deklaration using
in der abgeleiteten Klasse platzieren.
Von §12.9 / 4 [class.inhctor]
Ein so deklarierter Konstruktor hat den gleichen Zugriff wie der entsprechende Konstruktor in
X
. ...
Sie können den Fehler beheben, indem Sie den abgeleiteten Klassen explizit Konstruktoren hinzufügen, anstatt sie von Base
zu übernehmen.
und
%Vor% Eine andere Lösung besteht natürlich darin, Base
's Konstruktor public
zu machen. Sie könnten auch seinen Destruktor protected
angeben, aber das ist nicht notwendig, da die Klasse aufgrund der reinen virtuellen Elementfunktion sowieso nicht instanziiert werden kann.
Freundschaft geht nicht in den Vererbungsbaum . Create ist ein Freund von Base und kann daher nicht auf die geschützten A :: A (int) und B :: B (int) zugreifen.
Mögliche Lösungen sind:
Create
sein) Base
(und damit auch ihr Freund, Create
) erstellen kann und der Rest nur kopieren kann. Idee von hier . Code für die letzte Lösung:
%Vor%Tags und Links c++ c++11 inheritance friend factory