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
d-oli Yves3 „c++: problem mit dynamic_cast.... funktioniert dieses programm b“
Optionen

Hi,

Habe das mit "gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)" und "GNU Make version 3.79.1, built for i386-redhat-linux-gnu" kompilliert und gelinkt.

C++ Source
**************


// 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;
}


Makefile Source:
*******************


CXX = g++
LDFLAGS = -g -pedantic -W -Wall
PGNAME = mammal

.PHONY: all clean

all: mammal

mammal.o: mammal.cpp
$(CXX) -O2 -c mammal.cpp

mammal: mammal.o
$(CXX) -o $(PGNAME) $(LDFLAGS) mammal.o

clean:
rm -f *.o
rm -f
$(PGNAME)




Ausgabe make:
******************
$ make
g++ -O2 -c mammal.cpp
In file included from /usr/include/c++/3.2.2/backward/iostream.h:31,
from mammal.cpp:2:
/usr/include/c++/3.2.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the
Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
die speak methoden der a d-oli