Initialisierung von vererbten Attributen



  • Guten Abend,
    ich möchte in einem Konstruktor einer abgeleiteten Klasse sowohl die Attribute dieser wie auch die der Basisklasse initialisieren:

    #include <iostream>
    using namespace std;
    
    class A{
    	int a;
    	double b;
    	public:
    		A(){}
    		A(int x, double y):a(x),b(y){}
    };
    
    class B:public A{
    	float c;
    	public:
    		B(){}
    		B(float z, int x, double y):c(z),A(x),A(y){}
    };
    
    int main(){}
    

    Was übersehe ich, dass der Compiler über die fehlende Deklaration von x und y im Konstruktor von B in diesem Gültigkeitsbereich meckert?



  • B(float z, int x, double y) : A(x,y), c(z) {}
    


  • Privatbesitz! Betreten verboten!

    Mach's doch so:

    B(float z, int x, double y) : A(x, y), c(z) {}
    

    ~Edit: Grazie, Gugelmoser.~



  • Die Initialisierung erfolgt
    1. von Basisklassen, dann
    2. von Membern in der Reihenfolge Ihrer Deklaration

    Und zu Deinem Fehler:
    "A" als Basisklasse hat keinen Konstruktor A(int) oder A(double) .
    Also muss es heißen:

    class A{
        // wie oben
    }
    
    class B:public A{
        float c;
        public:
            B(){}
            B(float z, int x, double y): A(x,y), c(z)
    };
    

    ...wie ja schon geschrieben wurde... 😉

    23:02h



  • Caligulaminus schrieb:

    ~Edit: Grazie, Gugelmoser.~

    Deins war nicht falsch. Es war nur nicht die logische Wahl. 😉



  • Gugelmoser schrieb:

    Deins war nicht falsch. Es war nur nicht die logische Wahl. 😉

    Form sollte Inhalt reflektieren.

    Nochmal Danke ~- ich hätt' gedacht, es wär' verboten.~


Anmelden zum Antworten