Ich versuche zu verhindern, dass eine Klasse in der Lage sein wird, seinen "This" -Zeiger in einen Zeiger einer seiner Schnittstellen zu konvertieren. Ich tue dies, indem ich private Vererbung über eine mittlere Proxy-Klasse verwende. Das Problem ist, dass die private Vererbung alle öffentlichen statischen Member und Typen der Basisklasse für alle Klassen unter der erbenden Klasse in der Hierarchie unzugänglich macht.C++ private Vererbung und statische Mitglieder/Typen
class Base
{
public:
enum Enum
{
value
};
};
class Middle : private Base
{
};
class Child : public Middle
{
public:
void Method()
{
Base::Enum e = Base::value; // doesn't compile BAD!
Base* base = this; // doesn't compile GOOD!
}
};
Ich habe versucht, dies sowohl in VS2008 (die erforderliche Version) und VS2010, weder Arbeit.
Kann jemand an einen Workaround denken? Oder ein anderer Ansatz, um die Konvertierung zu stoppen?
Auch ich bin Kuriositäten des Verhaltens, ist es nur ein Nebeneffekt der Compiler-Implementierung, oder ist es von Entwurf? Wenn von Entwurf, warum? Ich dachte immer an private Vererbung, dass niemand weiß, dass Middle von Base erbt. Das gezeigte Verhalten impliziert jedoch, dass private Vererbung viel mehr bedeutet als das, tatsächlich hat Child weniger Zugriff auf Base als jeder Namespace, der nicht in der Klassenhierarchie ist!
+1: Eine sehr interessante Frage, in der Tat. –