2017-12-25 5 views
0

unterhalb der Linie Betrachten Code vonwarum dieser Wert Zeiger nach dem Hinzufügen virtuelles Schlüsselwort in C++ geändert

#include<iostream> 
using namespace std; 

class base 
{ 
int i; 
public: 
void printb() 
{ 
cout << "This pointer of base "<<this<<endl; 
} 
}; 

class derived: public base 
{ 
int i; 
public: 
void printd() 
{ 
cout << "This pointer of derived "<<this<<endl; 
} 
}; 

main() 
{ 

derived d1; 
d1.printd(); 
d1.printb(); 
} 

Nachdem mit g Kompilieren ++ (4.8.4) in Maschinen Ergebnis 64bit ubuntu ist

This pointer of derived 0x7ffe74697ac0 
This pointer of base 0x7ffe74697ac0 

Per mein Verständnis sowohl Basis und abgeleitet dieser Zeiger wird gleich sein, da wir mit einzelnen Objekt aufrufen. I hinzugefügt virtuelles Schlüsselwort printd() Funktion der abgeleiteten Klasse, wie unten

#include<iostream> 
using namespace std; 

class base 
{ 
int i; 
public: 
void printb() 
{ 
cout << "This pointer of base "<<this<<endl; 
} 
}; 

class derived: public base 
{ 
int i; 
public: 
virtual void printd() 
{ 
cout << "This pointer of derived "<<this<<endl; 
} 
}; 

main() 
{ 

derived d1; 
d1.printd(); 
d1.printb(); 
} 

Ausgabe des obigen Codes ist, wie unten

This pointer of derived 0x7ffee969b1d0 
This pointer of base 0x7ffee969b1d8 

Hier Dieser Zeigerwert in abgeleitet und Base unterschiedlich ist auch wenn mit einem einzelnen Objekt aufrufen.Jede Zeit, die ich das Programm ausführen gibt es einen Unterschied von 1byte zwischen dieser Zeiger und Basis dieser Zeiger. Kann jemand sagen, warum dieser Unterschied in diese Zeiger und wie virtuelle Stichwort diese Zeiger beeinflussen.

+3

Es ist nicht 1 Byte, es ist eine ganze 8 von ihnen. Die Anzahl der Bytes eines Zeigers auf Ihrer Plattform. – StoryTeller

+0

Weil Sie den Compiler gezwungen haben, eine virtuelle Funktionstabelle zu erstellen. – EJP

Antwort

4

Mit dem Schlüsselwort virtual haben Sie derived polymorph gemacht. Eine gängige Implementierung von Laufzeitpolymorphismus ist das Hinzufügen eines Zeigers zum Start des Objekts. Diese vptr zeigt auf eine Tabelle mit Funktionen, die dynamisch ausgelöst werden (allgemein bekannt als vtable). Das base Unterobjekt, das nicht polymorph ist, wird innerhalb des Superobjekts derived durch den versteckten Zeiger versetzt.

Der Zeiger wird automatisch angepasst, weil der Compiler Code eingibt, um diese Anpassung beim Aufruf einer Elementfunktion durchzuführen. Dadurch wird sichergestellt, dass printb auf alle (potenziellen) Mitglieder von base an der richtigen Stelle zugreift.

Verwandte Themen