如何在if语句中使用dynamic_cast

Mel*_*oks 0 c++ dynamic-cast class base-class

所以我有一个简单的任务要做.从一个基类派生出3个类.它们非常简单,将在下面提供.我需要做的是创建一个名为的新类PolymorphicAnimal,它将能够像animalAnimal基类派生的任何其他类一样运行.确切地说,他们需要做的就是在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))
}
};
Run Code Online (Sandbox Code Playgroud)

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

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

Bat*_*eba 10

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

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

笔记:

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


Pau*_*ers 5

dynamic_cast 几乎总是一个黑客.

你为什么不添加一个虚拟方法Animal,然后再有Dog,CatCow以通常的方式覆盖它?或者你不控制这些课程?