typeid(*head[i][t]) == typeid(lion)
时间: 2024-05-29 08:15:28 浏览: 8
这段代码是判断指向 `head[i][t]` 指针所指的对象的类型是否为 `lion` 类型。`typeid` 运算符返回一个 `std::type_info` 类型的对象,该对象表示其操作数的类型。因此,`typeid(*head[i][t])` 返回一个 `std::type_info` 类型的对象,表示 `*head[i][t]` 所指的对象的类型。`typeid(lion)` 返回 `lion` 类型的 `std::type_info` 对象。因此,`typeid(*head[i][t]) == typeid(lion)` 表示 `*head[i][t]` 所指的对象是否是 `lion` 类型的对象。如果相等,返回 `true`,否则返回 `false`。
相关问题
已知:动物、狗、鸟三个类的设计如下(仅有函数的声明,不考虑函数的实现) 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(); // 鸟会飞 } }
下面是完整的代码实现:
```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`将指针转换为对应的派生类指针,以便调用派生类中新增的成员函数。
inline TypeId &operator = (const TypeId &o);
这是一个类中的赋值运算符重载函数,用于将一个 TypeId 对象赋值给另一个 TypeId 对象。其中,inline 表示该函数是内联函数,TypeId & 表示返回值类型为 TypeId 的引用,operator= 表示重载的是赋值运算符,const TypeId &o 表示传入的参数是一个常量引用,即要赋值的 TypeId 对象。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)