Problem bei Inistialisierung der Basisklassen



  • Guten Tag,

    ich lerne gerade C++ und habe mal ein kurzes Testprogramm geschrieben:

    test.h

    class Man
    {
    protected:
    	int a, b, c;
    public:
    	Man();
    	Man(int _a, int _b, int _c);
    
    	int getA();
    	int getB();
    	int getC();
    };
    
    class Bishop : virtual public Man
    {
    public:
    	Bishop();
    	Bishop(int _a, int _b, int _c);
    };
    
    class Castle : virtual public Man
    {
    public:
    	Castle();
    	Castle(int _a, int _b, int _c);
    };
    
    class Queen : public Castle, public Bishop
    {
    public:
    	Queen();
    	Queen(int _a, int _b, int _c);
    };
    
    class Pawn : public Queen
    {
    public:
    	Pawn();
    	Pawn(int _a, int _b, int _c);
    };
    
    ///////////////
    extern Pawn g_pawn;
    

    test.cpp

    #include "test.h"
    #include <iostream>
    
    Pawn g_pawn;
    
    Man::Man ()
    {}
    
    Man::Man (int _a, int _b, int _c)
    		: a(_a), b(_b), c(_c)
    {}
    
    int Man::getA ()
    {
    	return a;
    }
    
    int Man::getB ()
    {
    	return b;
    }
    
    int Man::getC ()
    {
    	return c;
    }
    
    Bishop::Bishop ()
    {}
    
    Bishop::Bishop (int _a, int _b, int _c)
    		: Man(_a, _b, _c)
    {}
    
    Castle::Castle ()
    {}
    
    Castle::Castle (int _a, int _b, int _c)
    		: Man(_a, _b, _c)
    {}
    
    Queen::Queen ()
    {}
    
    Queen::Queen (int _a, int _b, int _c)
    		: Castle(_a, _b, _c), Bishop(_a, _b, _c)
    {}
    
    Pawn::Pawn ()
    {}
    
    Pawn::Pawn (int _a, int _b, int _c)
    		: Queen(_a, _b, _c)
    {}
    
    int main()
    {
    	g_pawn = Pawn(1, 1, 1);
    
    	std::cout <<"A: " <<g_pawn.getA() <<"\nB: " <<g_pawn.getB() <<"\nC: " <<g_pawn.getC() <<'\n';
    	system("pause");
    }
    

    Als Ausgabe erhalte ich:

    A: -858993460
    B: -858993460
    C: -858993460
    Drücken Sie eine beliebige Taste . . .
    

    Meine Frage ist nun: Warum sind a, b und c anders initialisiert als ich es angegeben habe?

    Vielen Dank schonmal im Voraus!


  • Mod

    TestTest schrieb:

    Meine Frage ist nun: Warum sind a, b und c anders initialisiert als ich es angegeben habe?

    Weil virtuelle Basisklassen direkt von der am weitesten abgleiteten Klasse initialisiert werden. In diesem Falle wird, da nicht explizit (im Konstruktor von Pawn) angegeben, der Defaultkonstuktor von Man ausgeführt, der nichts tut. Die expliziten Aufrufe aus den Konstruktoren von Bishop und Castle werden hingegen nicht ausgeführt, weil Bishop bzw. Castle nicht die Klasse des finalen Objektes darstellen.



  • Ah, interessant. Danke für die schnelle Hilfe, klappt sehr gut. Ich habe jetzt einfach den Konstruktor von Pawn so umgeschrieben:

    Pawn::Pawn (int _a, int _b, int _c)
    		: Queen(_a, _b, _c), Man(_a, _b, _c)
    {}
    


  • Dein ganzes Klassendesign paßt aber nicht, denn ein Bauer ist genausowenig eine Dame, wie eine Dame ein Turm und Läufer ist...


Anmelden zum Antworten