2011-01-05 10 views
4
#include<iostream> 

class base{ 
public: 
base(){std::cout<<"In base";} 
}; 

class dv1:virtual private base { 
public: 
dv1(){std::cout<<"In DV1";} 
}; 

class dv2:virtual private base { 
public: 
dv2(){std::cout<<"In DV2";} 
}; 

class drv : public dv1, public dv2 { 
public: 
drv() {std::cout<<"Why is this working";} 
}; 

int main() { 
drv obj; 

return 0; 
} 

Ist im Falle der virtuellen Vererbung nicht die Verantwortung für die meisten abgeleiteten Klassen, den Konstruktor aufzurufen? Hinweis: Hier wird Basis virtuell und privat geerbt.Wer ruft den Konstruktor in virtueller Vererbung auf?

+0

und was ist der Ausgang erzeugen wird erwarteten? Wenn Sie etwas anderes erwartet haben, schlage ich vor, dass Sie zurückgehen und das Kapitel über die Erbschaft noch einmal durchgehen und versuchen, das zuerst zu verstehen. – Nim

+0

Ich erwarte, dass es nicht kompiliert wird, da die Basis virtuell und privat abgeleitet wird. – Learner

Antwort

5

Ihr Konstruktor drv nicht explizit die Erbauer der Basisklasse aufrufen (n), so dass der Compiler einen Aufruf an den parameterlosen Konstruktor der Basisklasse gegenüber, was Sie

+0

Das ist richtig ... Aber wie ist es dazu in der Lage? – Learner

+2

'base :: base()' ist öffentlich, also hat 'drv' Zugriff auf diesen Konstruktor. Die Tatsache, dass "base" eine private Basis von "dv1" und "dv2" ist, ist nicht relevant. –