读书人

知道错在哪里但不知道什么错解决思路

发布时间: 2012-03-09 16:54:57 作者: rapoo

知道错在哪里,但不知道什么错

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 完全没有错!不知道楼主的是什么错。

读书人网 >C语言

热点推荐