2017-07-03 2 views
-2
#include<iostream> 
using namespace std; 

class A { 
     int i; 
public: 
    // A() {cout<<"in A's def const\n";}; 
    A(int k) {cout<<"In A const\n"; i = k; } 
    }; 

class B : public A { 
public: 
    //B(){cout<<"in B's def const\n";}; 
    B(int i) : A(i) {cout<<"in B const\n";} 
    }; 

    class C : public B { 
    public: 
    C() {cout<<"in C def cstr\n";} 
    C(int i) : B(i) {cout<<"in C const\n";} 
    }; 

int main() 
{ 
    C obj=new C(2); 
    return 0; 
    } 

, wenn ich diesen Code leite zeigt es Im Konstruktor 'C :: C()': 88c8237e3ffce7819f082b210069fd59.cpp: 19: 13: Fehler: keine passende Funktion für Aufruf von ' B :: B()‘Ausgabe von Multi-Level-Vererbung Programmcode

, warum dies geschieht, wie ich bin nur parametrisierte Konstruktoren caling explizit C() everywhere.??please helfen {cout < < "in C def cstr \ n";}

+0

_ "ich parametrisiere nur explizit Konstruktoren explizit überall" _ - Schau noch einmal, du bist nicht. –

+0

Wenn Sie keinen Basisklassenkonstruktor explizit angeben, wird der Standardkonstruktor aufgerufen. Da Ihre Klasse B keinen Basisklassenkonstruktor hat, haben Sie einen Fehler. –

Antwort

6

Sie können

nicht deklarieren
C() {cout<<"in C def cstr\n";} 

Da keine der Basisklassen A und B Standardkonstruktoren (nicht parametrisiert) haben. Wenn Sie diese auskommentiert your code would compile (außer für den Kommentar unten).

Side Kommentar, ist dies nicht korrekt ist

C obj=new C(2); 

Sie eine der folgenden verwenden könnte

C obj(2); 
C obj{2}; 
C obj = C(2); 

Aber mit new würden Sie zu einem Zeiger zuweisen müssen (was würde ich nicht empfehlen, es sei denn, Sie benötigen Heap allokierte Objekte aus irgendeinem Grund, in diesem Fall bevorzugen Sie Smartpointer).

C* obj = new C(2); 
delete obj; // remember to delete it when you're done