知道错在哪里,但不知道什么错
- C/C++ code
#include <iostream>class Mammal{public: Mammal():age(1) { std::cout << "Mammal construct\n"; } virtual ~Mammal() { std::cout << "Mammal destruct\n"; } virtual void speak() const { std::cout << "Mammal speak\n"; }protected: int age;};class Cat: public Mammal{public: Cat() { std::cout << "Cat constructor\n"; } ~Cat() { std::cout << "Cat destructor\n"; } void speak() const { std::cout << "Meow!\n"; } void purr() const { std::cout << "Rrrrrrrr\n"; }};class Dog: public Mammal{public: Dog() { std::cout << "Dog constructor\n"; } ~Dog() { std::cout << "Dof destructor\n"; } void speak() const { std::cout << "Woof\n"; }};int main(){ const int numberMammals = 3; Mammal* zoo[numberMammals]; Mammal* pMammal; int choice,i; for (i = 0; i < numberMammals; i++) { std::cout << "(1)Dog (2)Cat: "; std::cin >> choice; if(choice == 1) zoo[i] = new Dog; else zoo[i] = new Cat; } std::cout << "\n"; for (i=0; i < numberMammals; i++) { zoo[i]->speak(); Cat *pRealCat = dynamic_cast<Cat *> (zoo[i]); //问题出在这里,但是我是按书上的,??? if (pRealCat) pRealCat->purr(); else std::cout << "Uh oh, not a cat!\n"; delete zoo[i]; std::cout << "\n"; } return 0;}[解决办法]
不会C++啊。。不是有个C++区嘛?
[解决办法]
(1)Dog (2)Cat: 1
Mammal construct
Dog constructor
(1)Dog (2)Cat: 2
Mammal construct
Cat constructor
(1)Dog (2)Cat: 1
Mammal construct
Dog constructor
Woof
Uh oh, not a cat!
Dof destructor
Mammal destruct
Meow!
Rrrrrrrr
Cat destructor
Mammal destruct
Woof
Uh oh, not a cat!
Dof destructor
Mammal destruct
[解决办法]
我的理解是,在类层次间进行下行转换时,dynamic_cast会类型检查,Cat *pRealCat = dynamic_cast<Cat *> (zoo[i])是要把Mammal类型的指针转换成Cat类型,dynamic_cast执行失败,因为Cat的一些属性Mammal没有。一个解决办法是把dynamic_cast用static_cast代替,因为static_cast不会类型检查(不过存在不安全因素)
[解决办法]
vs2008 完全没有错!不知道楼主的是什么错。