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.