2016-04-14 5 views
0

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?

+4

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

+0

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. –

+0

@SergeyA, weil Sie nicht mit der Praxis übereinstimmen, die ich von jemand anderem zitiert habe, oder wegen der Einzelheiten der Verwendung von vtable? –

Antwort

1

Es behält es VTable die Funktion ptr Einträge, und obwohl es „unangebrachte“ über die VTable in Bezug auf private oder public, zu sprechen, weil es ein Compiler Detail ist, wird es immer geben und seine „public“.

Um diesen Punkt weiter zu erweitern, bin ich nicht vertraut mit der Spezifikation zu diesem Thema, aber ich glaube (basierend auf viele generierte Assembler von C/C++ Code aus verschiedenen Compilern) Monomorphisierung der Funktion in einem virtuellen , auch wenn keine Spezialisierung (zur Laufzeit oder sonst) benötigt wird, ist verboten.

+3

Eine weitere fehlgeleitete ** Best Practice **. Private virtuals sind ein wunderbares Werkzeug, und der Grund, das Tool nicht zu benutzen, nur weil jemand verwirrt ist, ist bestenfalls zweifelhaft. – SergeyA

+0

Ich kann Sympathien für Meinungsverschiedenheiten über Best Practice haben, aber stimmt etwas nicht mit der tatsächlichen Antwort (Vtable-Implementierung)? –

+0

Entfernen Sie den sehr falschen Teil der privaten virtuellen Funktionen und es wird die OK-Antwort sein. – SergeyA