dynamic_cast



  • Bin grad ganz neu in das Thema "dynamic_cast" in meinem Buch eingestiegen, und deshalb kau ich gerade n paar Beispiele durch. Wrum funktioniert das nicht:

    #include <iostream>
    using namespace std;
    
    class Computer
    {
        public:
        Computer(int v_);
        Computer(const Computer &rhs);
        ~Computer();
        inline int get_v() const {return *m_v;}
    
        private:
        int *m_v;
    };
    
    Computer::Computer(int v_)
    {
        m_v=new int(v_);
    }
    
    Computer::Computer(const Computer &rhs)
    {
        m_v=new int(rhs.get_v());
    }
    
    Computer::~Computer()
    {
        delete m_v;
    }
    
    class Station1 : public Computer
    {
        public:
        Station1(int i_v_,int v1_);
        Station1(const Station1 &rhs);
        ~Station1();
        inline int get_v1() const {return *m_v1;}
    
        private:
        int *m_v1;
    };
    
    Station1::Station1(int i_v_,int v1_)
    :Computer(i_v_)
    {
        m_v1=new int(v1_);
    }
    
    Station1::Station1(const Station1 &rhs)
    :Computer(rhs)
    {
        m_v1=new int(rhs.get_v1());
    }
    
    Station1::~Station1()
    {
    
    }
    
    int main()
    {
        Computer *andi=new Station1(33,12);
        Station1 *temp=dynamic_cast<Station1 *> (andi);
    
        return 0;
    }
    

    ERROR'S

    Compiling: C:\MinGW\Andi\kapitel 18.cpp
    C:\MinGW\Andi\kapitel 18.cpp: In function int main()': C:\\MinGW\\Andi\\kapitel 18.cpp:65: error: cannot dynamic_cast \andi' (of type `class Computer*') to type `class Station1*' (source type is not polymorphic)
    Process terminated with status 1 (0 minutes, 0 seconds)
    1 errors, 0 warnings

    MfG
    Stromberg



  • Weil dynamic_cast nur mit polymorpher (virtueller) Vererbung funktioniert.



  • Reicht es da schon wenn nur ein Element virtuell ist? Reicht es z.B. wenn der Destruktor von Computer virtuell wäre?


  • Mod

    dynamic_cast benötigt für down- und cross-casts (upcast geht immer [wenn eindeutig und keine Zugriffschranken vorhanden] und funktioniert wie die implizite Konvcertierung) einen Zeiger oder eine Referenz auf ein Objekt einer polymorphen Klasse. Eine Klasse ist polymorph, wenn sie wenigstens eine virtuelle Funktion (zur Not auch nur geerbt) besitzt. Für den Zieltyp des casts gilt diese Einschränkung nicht. Die Klasse Computer hat keine virtuelle Memberfunktion und ist folglich nicht polymorph, ein downcast mit einem Zeiger auf diese Klasse als Argument damit nicht möglich. In aller Regel ist es richtig, in Basisklassen den Destruktor virtuell zu machen (will man das Objekt über einen Zeiger auf diese Basisklasse zerstören, ist es sogar notwendig). Als angenehmer Nebeneffekt wird die Klasse polymorph und der downcast mittels dynamic_cast wird möglich.

    Mit virtueller Vererbung hat das nichts zu tun; mit dem Begriff "polymorphe Vererbung" kann ich nichts anfangen.



  • Stromberg schrieb:

    Reicht es da schon wenn nur ein Element virtuell ist? Reicht es z.B. wenn der Destruktor von Computer virtuell wäre?

    ja


Anmelden zum Antworten