rein virtual function



  • Und bei dem

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Base
    {
    public:
    	virtual ~Base () = 0;
        virtual void print (string const &str) = 0;
    };
    
    Base::~Base ()
    {}
    
    class Derived : public Base
    {
    public:
        virtual void print (string const &str);
    };
    
    void Derived::print (string const &str)
    {
        cout << str << endl;
    }
    
    int main ()
    {
    	string str ("Hallo Welt!\n");
    
    	Base *pBase = new Derived;
    
    	pBase->print (str);
    
        delete pBase;
    }
    


  • tja also die exception kommt schon allein beim erzeugen des zeigers.

    Basis * p_basis_object = new Xxx;

    ?Komisch, was will mir die exception sagen, das die klasse irgendwelche virtuellen funktionen enthält, die nicht sein dürfen?

    ich glaub es liegt an einer anderen rein virtuellen Funktion, die ich im constructer der abgeleiteten klassen aufrufe, mein fehler.

    dank trotzdem für eure hilfe.



  • es ist keine exception! es ist ein compier-fehler!



  • virtual void Write(void* buf, int size) = 0; //pure virtual funktion für alle abgeleiteten klassen

    virtual void Write(void* buf, int size); //hier kannst du das 'virtual' auch entfernen

    wozu wird die funktion überhaupt als 'pure virtual' von dir deklariert? nimm die '=0' weg und vielleicht funzt es. habe es nicht probiert, versuch es einfach. 🙂



  • hi!

    mir leutet nicht ein warum auch der konstruktor:

    virtual ~Base () = 0;
    

    cu



  • sorry destruktor!

    cu



  • cpp. schrieb:

    hi!

    mir leutet nicht ein warum auch der konstruktor:

    virtual ~Base () = 0;
    

    cu

    Damit man von der Basisklasse keine Instanzen erzeugen kann.



  • ich dachte immer, man kann von Klassen mit rein virtuellen Funktionen sowieso keine Instanzen erstellen 😕 Und wenn die abgeleitete Klasse keinen Destruktor definiert, dann kann man von dieser ja eigentlich auch keine Instanz erstellen. Oder seh ich das falsch?
    geloescht



  • es gibt immer nen default dtor



  • geloescht schrieb:

    ich dachte immer, man kann von Klassen mit rein virtuellen Funktionen sowieso keine Instanzen erstellen 😕 Und wenn die abgeleitete Klasse keinen Destruktor definiert, dann kann man von dieser ja eigentlich auch keine Instanz erstellen. Oder seh ich das falsch?
    geloescht

    Es ist wohl sinnlos den Destruktor rein virtuell zu machen. Wenn die Derived Klasse keinen eigenen definert, generiert der Kompiler automatisch einen. Andererseits muß man immer auch den Destruktor der Basisklasse definieren, da man die Objekte nicht abbauen kann, wenn der Destruktor fehlt. Das bemängelt der Kompiler spätestens beim Linken.



  • Es ist wohl sinnlos den Destruktor rein virtuell zu machen.

    den dtor pure virtual zu machen ist spätestens dann sinnvoll, wenn man eine Klasse hat, die nur vererbt werden können soll, aber man keinen passenden kandidaten für eine pure virtual methode hat. der dtor ist in dem fall eine sinnvolle alternative.



  • otze schrieb:

    Es ist wohl sinnlos den Destruktor rein virtuell zu machen.

    den dtor pure virtual zu machen ist spätestens dann sinnvoll, wenn man eine Klasse hat, die nur vererbt werden können soll, aber man keinen passenden kandidaten für eine pure virtual methode hat. der dtor ist in dem fall eine sinnvolle alternative.

    gut von hume sikkins kopiert 👍 👎 👍



  • kopiert? selbst geschrieben.

    das wissen kommt aber von hume, da haste recht.



  • otze schrieb:

    Es ist wohl sinnlos den Destruktor rein virtuell zu machen.

    den dtor pure virtual zu machen ist spätestens dann sinnvoll, wenn man eine Klasse hat, die nur vererbt werden können soll, aber man keinen passenden kandidaten für eine pure virtual methode hat. der dtor ist in dem fall eine sinnvolle alternative.

    Ok, mit solchen Klassen musste ich mich noch nicht abgeben und ich wüsste auch nicht wann dies der Fall sein könnte.



  • hi!
    hier auch ein schönes beispiel zu diesem thema!;-) so wird meinstens ne abstrakte klasse eingesetzt?

    cu

    class Mensch
    {
          public:
          virtual void zeichnen() const = 0;    // pure virtual Memberfunktion
    };
    
    class Kind: public Mensch
    {
          public:
          void zeichnen() const
          {
          cout << "----------------" << endl;
          }
    };
    
    class Omi: public Mensch
    {
          public:
          void zeichnen() const
          {
               cout << "~##++~~~~1212``´´´''**++~~**''''" << endl;
          }
    };
    
    class Lebewesen
    {
          public:
          void zeichnen (Mensch& mensch)
          {
               mensch.zeichnen ();
          }
    };
    
    int main()
    {
      Mensch *p_Base;
      Lebewesen *m_ptr = new Lebewesen;
      p_Base  = new Lebewesen;
    
      p_Base = new Kind;
      m_ptr->zeichnen(*p_Base);
    
      p_Base = new Omi;
      m_ptr->zeichnen(*p_Base);
    
      cin.get();
    
      return 0;
    }
    


  • und die speicherlecks sollen auch direkt nachgemacht werden?

    btw: was soll eigentlich gezeichnet werden?



  • ja hatte delete aufrufen vergessen...sry
    cu


Anmelden zum Antworten