pure virtual function call



  • Hallo :schland: 🙂

    Habe folgendes Problem. Habe eine Basisklasse und mehrere abgeleitete Klassen. In der Basisklasse sind nun mehrere abstracte Methoden deklariert. Diese Methoden sollen nun ausgeführt werden wenn ein Objekt von einer der abgeleitete Klassen erzeugt wird. Also hier mal ein Beispiel:

    class CBase
    {
    public:
    	CBase()
    	{
    		this->Init();
    	}
    	virtual ~CBase(){}
    
    	void Init()
    	{
    		this->Read();
    		this->Calc();
    	}
    
    	virtual void Read() = 0;
    	virtual void Calc() = 0;
    };
    
    class CDerived :
    	public CBase
    {
    public:
    	CDerived() {}
    	virtual ~CDerived() {}
    
    	virtual void Read(){AfxMessageBox("CDerived::Read");}
    	virtual void Calc(){AfxMessageBox("CDerived::Calc");}
    };
    

    Also beim kompilieren gibt es keinen Fehler. Allerdings bei der Ausführung erhalte ich die Meldung pure virtual function call.

    Wie löse ich das Problem.



  • Indem du keine virtuellen Aufrufe im constructor machst.



  • Hallo

    Wie schaffe ich es dann dass beim erzeugen eines Objekts dieser Klasse unbedingt diese Funktionen aufgerufen werden.


  • Mod

    Trenne Konstrukt und Initialisierung.

    Wenn CBase erzeugt wird (als abgeleitete Klasse), ist CDerived noch nicht konstruiert.
    D.h. auch die virtuellen Funktionen von CDerived können erst aufgerufen werden wenn der Konstruktor von CDerived abläuft!

    Es ist unmöglich im Konstruktor einer Basis-Klasse virtuelle Funktionen einer abgeleiteten Klasse auszuführen!

    Lösung: (s.o.) Trenne Konstruktion von Initialisierung!

    Ansonsten bleibt Dir nichtas andres übrig als in jeder abgeleiteten Klasse Init() selbst im Konstruktor aufzurufen, aber das wird Dir wieder nichts helfen, wenn CDerived erneut abgeleitet wird... Dies ist menes Erachtens ein gefährliches unsicheres Design.



  • Das heißt ich erzeuge mein Objekt und danach rufe ich eine Methode init auf die mir diese Funktionen ausführt?



  • vonne-proppen schrieb:

    Das heißt ich erzeuge mein Objekt und danach rufe ich eine Methode init auf die mir diese Funktionen ausführt?

    Ja genau. Und wenn Du es schön machen möchtest kannst Du eine Factory verwenden.

    Simon


Log in to reply