Ich ging durch die virtuellen Funktionen und VTables und bekam einen Zweifel. Angenommen, ich als Code unten etwas haben:Wird der eingefügte Compiler vptr privat, wenn die Basisklasse privat abgeleitet wird?
class base
{
public:
virtual void fun(){}
};
class derived : private base
{
public:
void fun(){}
};
Mit der Bereichsregel, wenn Basisklasse als private dann alle Mitglieder es abgeleitet ist von abgeleiteten Klasse wird privat. Wird der Compiler, der vptr (Zeiger auf vtable) eingefügt hat, auch privat für die abgeleitete Klasse werden?
Das 'vptr' ist ein Hinter-den-Kulissen-Konzept. Es wird nicht "privat", weil man weder direkt darauf zugreifen noch sein Layout kennen kann. Was es jedoch bedeutet, ist, dass Leute, die ein abgeleitetes Objekt haben, nicht darauf zugreifen können (oder es in ... konvertieren), weil der Compiler sich beschweren wird, dass es sich um eine private Vererbung handelt. – inetknght
In der Sprache C++ gibt es so etwas wie 'vptr' nicht (Sie können den Standardentwurf suchen und selbst sehen). Ihre Implementierung kann (oder auch nicht) eine Implementierungstechnik mit diesem Namen verwenden. Es ist für das Programm nicht sichtbar, daher macht es keinen Sinn zu fragen, ob es privat ist oder nicht. –
@SergeyA, weil Sie nicht mit der Praxis übereinstimmen, die ich von jemand anderem zitiert habe, oder wegen der Einzelheiten der Verwendung von vtable? –