Von Basisklassen zeiger die abgeleitete ausgeben



  • hallo, ich habe gerade ein problem: "wie bekomme ich es hin (titel) bzw. wo liegt der fehler in meinem code?"

    funktion

    void Output(vector<C*> v){
    
            DERIVED* der;
    	cout.setf(ios::left);
    	cout << setw(5)  << "Derived:"<<endl;
    
    	for(unsigned int i=0; i<v.size(); ++i){
    		//downcast
    		if(typeid(DERIVED*) == typeid(v[i])){
    			der = dynamic_cast<CBook*> (v[i]);
    			cout << *der <<endl;
    		}
    
    	}
    }
    

    operator <<

    ostream& operator<<(ostream& stream, DERIVED der){
    	stream.setf(ios::left);
    	stream << setw(5) << getResult() <<endl;	
    	return stream;
    }
    

    vielen dank schonmal



  • Was sagt denn dein Compiler (bzw. das Programm)?

    Ansonsten: das typeid brauchst du nicht unbedingt für diesen Zweck - dynamic_cast reicht (btw, wo kommt auf einmal CBook her?):

    for(unsigned int i=0; i<v.size(); ++i){
      //downcast
      der = dynamic_cast<DERIVED*>(v[i]);
      if(der){//oder: if(der!=NULL)
        cout << *der <<endl;
      }
    }
    


  • class base
    {
    public:
      virtual ~base() { }
      virtual void output( std::ostream& out ) const = 0;
    };
    
    std::ostream& operator<<( std::ostream& out, base const& obj )
    { obj.output(out); return out; }
    
    class derived_a : public base
    {
    public:
      virtual void output( std::ostream& out ) const
      { out << "derived_a"; }
    };
    
    class derived_b : public base
    {
    public:
      virtual void output( std::ostream& out ) const
      { out << "derived_b"; }
    };
    
    // test:
    
    base* make_random_base()
    { if (rand() % 2) return new derived_a; else return new derived_b; }
    
    int main()
    {
      using namespace std;
    
      srand(time(0));
    
      vector<base*> objects;
      generate_n(back_inserter(objects), 10, make_random_base);
    
      copy(
        boost::make_indirect_iterator(objects.begin()),
        boost::make_indirect_iterator(objects.end()),
        ostream_iterator<base>(cout, "\n"));
    }
    


  • CStoll schrieb:

    ...(btw, wo kommt auf einmal CBook her?):

    das ist der basistyp

    compiler sagt mir:

    error C2683: "dynamic_cast": "CMedia" ist kein polymorpher Typ.



  • Dann sorg' doch dafür, daß CMedia polymorph ist - dynamic_cast benötigt RTTI-Informationen, deshalb brauchst du in der Basisklasse mindestens eine virtuelle Methode, damit es einsetzbar ist.

    PS: Und wo kommt jetzt schon wieder CMedia her? Wenn du schon keine Lust hast, die echten Namen deiner Klassen zu verraten, dann mach das bitte konsequent.


Log in to reply