Programmieren - alles kontrollieren 4.937 Themen, 20.645 Beiträge

c++: problem mit dynamic_cast.... funktioniert dieses programm b

Yves3 / 8 Antworten / Flachansicht Nickles

halo


ich hab eine code aus meinem buch. beim kompillieren mit visual studio 6.0 gibt es eine warnung.


warning C4541: 'dynamic_cast' fuer polymorphen Typ 'class Mammal' mit /GR- verwendet; unvorhersehbares Verhalten moeglich


bei meinem kollegen gibt es die selbe warnung. (leider auch visual studio 6.0) das programm stürzt dann nach der dritten eingabe ab. :-(


könntet ihr mal schauen, ob das programm bei euch auch abstürzt?(wenn möglich mit einem anderen kompiller) oder noch besser: wisst ihr, woran das liegt?


danke!


// Listing 18.2 - Dynamische Typumwandlung
#include <iostream.h>
class Mammal
{
  public:
 Mammal():itsAge(1) { cout << "Mammal-Konstruktor...\n"; }
 ~Mammal() { cout << "Mammal-Destruktor...\n"; }
 virtual void Speak() const { cout << "Mammal gib Laut!\n"; }
  protected:
 int itsAge;
};


class Cat: public Mammal
{
  public:
 Cat() { cout << "Cat-Konstruktor...\n"; }
 ~Cat() { cout << "Cat-Destruktor...\n"; }
 void Speak()const { cout << "Miau\n"; }
 void Purr() const { cout << "rrrrrrrrrrr\n"; }
};


class Dog: public Mammal
{
  public:
 Dog() { cout << "Dog-Konstruktor...\n"; }
 ~Dog() { cout << "Dog-Destruktor...\n"; }
 void Speak()const { cout << "Wuff!\n"; }
};



int main()
{
 const int NumberMammals = 3;
 Mammal* Zoo[NumberMammals];
 Mammal* pMammal;
 int choice,i;
 for (i=0; i<NumberMammals; i++)
 {
  cout << "(1)Hund (2)Katze: ";
  cin >> choice;
  if (choice == 1)
   pMammal = new Dog;
  else
   pMammal = new Cat;


  Zoo[i] = pMammal;
 }


 cout << "\n";


 for (i=0; i<NumberMammals; i++)
 {
  Zoo[i] ->Speak();


  Cat *pRealCat = 0;
  pRealCat = dynamic_cast< Cat *> (Zoo[i]);


  if (pRealCat)
   pRealCat->Purr();
  else
   cout << "Oh nein, keine Katze!\n";


  delete Zoo[i];
  cout << "\n";
 }


 return 0;
}

bei Antwort benachrichtigen
Yves3 d-oli „Hi, Habe das mit gcc version 3.2.2 20030222 Red Hat Linux 3.2.2-5 und GNU Make...“
Optionen

die speak methoden der abgeleiteten klassen sind jetzt auch "virtual".

leider kapier ich nicht ganz, was du damit meinst:
"#include iostream anstelle von iostream.h verwenden und dann using namespace std; oder std::cout std::cin etc."
sorry, ich hab noch nicht so viel erfahrung beim programmieren.

dein kompiller sagt, dass der code teilweise veraltet ist. weist du welcher teil?

ich werde jetz auch linux installieren und mal den kompiller probieren. das hatte ich eh schon lange vor. visual studio ist ja nicht gerade ein ansi c++ compiller, eher ms c++ ;-).




bei Antwort benachrichtigen
die speak methoden der a d-oli