2013-02-06 4 views
5

Betrachten der Code unter:C++: virtuelle Vererbung

#... 
class A {}; 
class B: public A{}; 
class C: virtual public A{}; 
class D: virtual public C{}; 
// No More Classes 
... 
int _tmain(int argc, _TCHAR* argv[]) { 
cout<<sizeof(A)<<" "; 
cout<<sizeof(B)<<" "; 
cout<<sizeof(C)<<" "; 
cout<<sizeof(D)<<"."; 

... 
} 

O/P: 1 1 4 8.

Frage:

  1. sizeof (A) = 1 Byte, und diese Lage halte was für den Compiler wichtig/us.
  2. Warum Compiler Mühe, vptr in C-Klasse-Objekt hinzufügen, wenn es nichts tatsächlich residiert.
  3. Wenn wir keine virtuelle Funktion haben, fügt der Compiler den abgeleiteten Objekten einen zusätzlichen vptr hinzu.

*. es ist meine erste Frage hier, bitte korrigieren Sie mich, wenn Sie etwas falsch gefunden haben.

+0

Für eine erste Frage hier: +1 für eine gute, gut formatierte und selbsterklärende Beitrag. –

+2

Ich sehe wirklich keine Fragen, nur eine Liste von Aussagen. –

+0

@JoachimPileborg - "2. Warum Compiler Mühe, vptr in C-Klasse-Objekt hinzufügen, wenn es nichts wirklich residiert". Ich denke, '3.' ist das gleiche wie' .2'. Und "1." ist höchstwahrscheinlich - was zeigt, dass der OP weiß, warum das Ergebnis "1" ist. –

Antwort

0

ad 1. Siehe PeddleSpam's answer

ad 2. IIRC der Compiler als weitere Informationen stellt nur virtuelle Funktionen Zeiger in den so genannten VMT. Eine weitere Information ist die Position des virtuellen A in C, denke ich.

ad 3. Siehe 2.