已知:动物、狗、鸟三个类的设计如下(仅有函数的声明,不考虑函数的实现) class Animal { // 动物基类 public: void Eat(); // 所有动物都会吃东西 virtual void Speak() = 0; // 所有动物都会叫,但是叫的方式不同 virtual ~Animal(); }; class Dog : public Animal { // 狗 public: void Speak(); // 狗汪汪叫 void Run(); // 狗会跑 ~Dog(); }; class Bird : public Animal { // 鸟 public: void Speak() ; // 鸟咕咕叫 void Fly(); // 鸟会飞 ~Bird() ; }; 现在有已有动物指针数组allAnis定义如下(忽略对象的创建和释放过程),需要实现所有动物都要吃东西、叫,狗会跑,鸟会飞。注意:大小写,如无特殊声明没有空格。 const int size = 4; Animal* allAnis[size]; // 忽略对象的创建 cout << "-----------运行中-----------" << endl; for ( ①有一个空格 : ② ) {// 遍历allAnis pa->Eat(); // 所有动物要吃东西 pa->Speak(); // 狗汪汪叫,鸟咕咕叫 if (typeid( ③ ) == typeid(Dog)) { // 如果当前对象为Dog类型 Dog* pd = dynamic_cast< ④ >(pa); pd->Run(); // 狗会跑 } else if (typeid(*p) == typeid( ⑤ )) { // 如果当前对象为Bird类型 ⑥ pb = dynamic_cast<Bird*>(p); pb->Fly(); // 鸟会飞 } }
时间: 2023-12-10 21:42:05 浏览: 81
定义三个类Point,Circle和Cylinder,Point类为基类,为上述3个类添加计算面积的成员函数Area(),要求函数Area()采用虚函数的形式,并通过基类指针调用虚函数Area()。
5星 · 资源好评率100%
下面是完整的代码实现:
```cpp
const int size = 4;
Animal* allAnis[size]; // 忽略对象的创建
for (int i = 0; i < size; i++) { // 遍历allAnis
Animal* pa = allAnis[i];
pa->Eat(); // 所有动物要吃东西
pa->Speak(); // 狗汪汪叫,鸟咕咕叫
if (typeid(*pa) == typeid(Dog)) { // 如果当前对象为Dog类型
Dog* pd = dynamic_cast<Dog*>(pa);
pd->Run(); // 狗会跑
} else if (typeid(*pa) == typeid(Bird)) { // 如果当前对象为Bird类型
Bird* pb = dynamic_cast<Bird*>(pa);
pb->Fly(); // 鸟会飞
}
}
```
其中,①应为`int i = 0`,②应为`size`,③应为`*pa`,④应为`Dog`,⑤应为`Bird`,⑥应为`Bird* pb`。需要注意的是,在判断对象类型时,应该使用`typeid(*pa)`而不是`typeid(pa)`,因为`typeid`运算符作用于指针类型时,只能获得指针的静态类型,而不是指向的对象的动态类型。因此,需要通过解引用指针来获得指向的对象的动态类型。此外,还需要使用`dynamic_cast`将指针转换为对应的派生类指针,以便调用派生类中新增的成员函数。
阅读全文