Ich versuche zu verhindern, dass eine Klasse ihren "this"-Zeiger in einen Zeiger einer ihrer Schnittstellen umwandeln kann. Dazu verwende ich private Vererbung über eine mittlere Proxyklasse. Das Problem ist, dass ich finde, dass private Vererbung alle öffentlichen statischen Mitglieder und Typen der Basisklasse für alle Klassen unterhalb der vererbenden Klasse in der Hierarchie unzugänglich macht.
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 dies sowohl in VS2008 (die erforderliche Version) als auch in VS2010 versucht, beide funktionieren nicht.
Fällt jemandem eine Abhilfe ein? Oder einen anderen Ansatz, um die Konvertierung zu stoppen?
Auch ich bin neugierig auf das Verhalten, ist es nur ein Nebeneffekt der Compiler-Implementierung, oder ist es durch Design? Wenn absichtlich, dann warum? Ich dachte immer, dass private Vererbung bedeutet, dass niemand weiß, dass Middle von Base erbt. Das gezeigte Verhalten deutet jedoch darauf hin, dass private Vererbung viel mehr als das bedeutet. Tatsächlich hat Child weniger Zugriff auf Base als jeder Namespace, der nicht in der Klassenhierarchie ist!