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

陈思有 2011-10-24 05:57:11
#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;
}
...全文
168 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Song9007206710328 2011-10-24
  • 打赏
  • 举报
回复
不可由基类对子类进行dynamic_cast,具体参见MSDN中的dynamic_cast
Roy_Smiling 2011-10-24
  • 打赏
  • 举报
回复
vs2008 完全没有错!不知道楼主的是什么错。
notitle1102 2011-10-24
  • 打赏
  • 举报
回复
我的理解是,在类层次间进行下行转换时,dynamic_cast会类型检查,Cat *pRealCat = dynamic_cast<Cat *> (zoo[i])是要把Mammal类型的指针转换成Cat类型,dynamic_cast执行失败,因为Cat的一些属性Mammal没有。一个解决办法是把dynamic_cast用static_cast代替,因为static_cast不会类型检查(不过存在不安全因素)
陈思有 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 programmingring 的回复:]
不会C++啊。。不是有个C++区嘛?
[/Quote]
以前都是来C语言区,所以不知不觉就……
qq120848369 2011-10-24
  • 打赏
  • 举报
回复
(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
ProgrammingRing 2011-10-24
  • 打赏
  • 举报
回复
不会C++啊。。不是有个C++区嘛?
陈思有 2011-10-24
  • 打赏
  • 举报
回复
原来要对VC6.0进行设置,但为什么要设置呢?
陈思有 2011-10-24
  • 打赏
  • 举报
回复
实在吃力

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧