如何在 if 语句中使用dynamic_cast

How to use dynamic_cast in if statement

本文关键字:dynamic cast if 语句      更新时间:2023-10-16

所以我有一个简单的任务要做。从一个基类派生了 3 个类。它们非常简单,将在下面提供。 我需要做的是创建一个名为PolymorphicAnimal的新类,它的行为与从Animal基类派生的任何其他animal一样。 确切地说,他们需要做的就是在调用方法SoundOff后显示正确的文本。我猜我需要在这里使用dynamic_cast。我的问题是,使用dynamic_cast作为if语句的正确语法是什么,所有派生类是否也需要至少有一个虚拟方法?

#include "stdafx.h"
#include <iostream>
#include <string>
class Animal {
public:
virtual std::string SoundOff() = 0;
};
class Dog : public Animal {
std::string SoundOff() override { return "Woof"; }
};
class Cat : public Animal {
std::string SoundOff() override { return "Meow"; }
};
class Cow : public Animal {
std::string SoundOff() override { return "Muu"; }
};
class PolymorphicAnimal : public Animal {
std::string sound;
public:
PolymorphicAnimal(const Animal &a) {
if(std::dynamic_cast<Cat*>(a))
}
};

if(std::dynamic_cast...行生成编译器错误:

syntax error '<', illegal token on the right side of ::expected an identifier

在C++中,您可以在if的条件中声明一个变量,这是一个强大的功能,您可以在此处利用。所以

if (auto kitty = dynamic_cast<const Cat*>(&a)){
// kitty is not nullptr
}

笔记:

  1. dynamic_cast是一个关键字;请删除std::
  2. 我用了一个指针dynamic_cast.引用替代项是不切实际的,因为通常不能期望将引用类型隐式转换为bool类型,如果引用强制转换失败,则会引发异常。

dynamic_cast几乎总是一个黑客。

为什么不向Animal添加另一个虚拟方法,然后让DogCatCow以通常的方式覆盖它? 还是你不控制这些类?

目前还不清楚PolymorphicAnimal应该做什么。 不知何故,你需要告诉PolymorphicAnimal如何表现,对吧?所以,我猜它更像是一个工厂,而不是一个派生类。

像这样:

class PolymorphicAnimal : Animal
{
private:
Animal *animal;
public:
PolymorphicAnimal(int type)
{
if (type == Type_Cat) // Type_Cat is an enum for example
{
animal = new Cat();
}
// ...add other types here
}
std::string SoundOff()
{
return animal->SoundOff();
}
}

通常,在正常程序中,您不需要执行if(某事dynamic_cast某事(。

虽然虚拟方法或访问者可能更合适,但您可以使用以下内容:

PolymorphicAnimal(const Animal &a) {
if (const auto* cat = dynamic_cast<const Cat*>(&a)) {
// use cat
} else if (const auto* dog = dynamic_cast<const Dog*>(&a)) {
// use dog
} // ...
}