Warum geht nur ein Pointer auf eine abstrakte Klasse



  • Hi

    Ich habe eine abstrakte Klasse Moveable. Die abstrakte Klasse Sprite soll ein Objekt des Typs Moveable haben.

    Wenn ich das so mache gehts:

    class Sprite
    {
    private:
    
    	Moveable * move_instance;
    
    };
    

    Das hier funktioniert jedoch nicht:

    class Sprite
    {
    private:
    
    	Moveable move_instance;
    
    };
    

    Mir ist eigentlich schon klar, was der Unterschied zwischen den beiden ist (hoffe ich zumindest ^^). Könnte mir bitte jemand erklären warum das zweite nicht funktioniert?



  • Die Klasse ist abstrakt, also können keine Instanzen davon erzeugt werden.



  • Das ist mir klar, dass ich keine Instanzen davon erzeugen darf.

    Aber wiso funktioniert es mit dem Pointer und warum mit dem anderen nicht? Könnte ich das hier nicht schreiben?

    Moveable move_instance = PlayerMove(); // PlayerMove is derived from Moveable
    

    Aber das hier schon:

    Moveable * move_instance = new PlayerMove(); // PlayerMove is derived from Moveable
    


  • > Könnte ich das hier nicht schreiben?

    Du kannst es schreiben, aber es wird nicht funktionieren. Du definierst ein Objekt vom Typ Moveable. Moveable ist aber abstrakt. Also geht's nicht. Punkt aus. Was erwartest Du denn, was da passieren soll? Denk mal für Dich darüber nach...



  • icarus2 schrieb:

    Moveable move_instance = PlayerMove(); // PlayerMove is derived from Moveable
    

    Hier wird eine Instanz von Moveable erzeugt und mit einem default-konstruierten PlayerMove-Objekt initialisiert (d.h. dieses Objekt wird einem Konstruktor, normalerweise passt dort der Kopierkonstruktor, von Moveable übergeben.)
    Bzw. würde, wenn Moveable nicht abstrakt wäre.

    Aber das hier schon:

    Moveable * move_instance = new PlayerMove(); // PlayerMove is derived from Moveable
    

    Hier wird nur ein Zeiger auf Moveable angelegt. Überhaupt kein Problem.



  • Vielen Dank euch zwei.

    Mir war nicht bewusst, dass beim ersten eine Instanz erzeugt und initialisiert wird.


Anmelden zum Antworten