动态向下转换为抽象类(C+;+;) 我试图从C++中了解一些面向对象的编程方面,我从java中知道。然而,我在使用Java中的instanceof时遇到了一些困难

动态向下转换为抽象类(C+;+;) 我试图从C++中了解一些面向对象的编程方面,我从java中知道。然而,我在使用Java中的instanceof时遇到了一些困难,c++,casting,polymorphism,C++,Casting,Polymorphism,我有一个基类Cell和一个派生(抽象)类障碍物。我这样定义它:障碍物:公共单元格和障碍物包含一个纯虚拟析构函数。现在在Cell类中,我想实现一个方法boolcell::isAccessible()。我已经按照如下方式实现了这一点: bool Cell::isAccessible() { Obstacle *obs = dynamic_cast<Obstacle*>(this); if (obs != NULL) return false; return t

我有一个基类
Cell
和一个派生(抽象)类
障碍物
。我这样定义它:
障碍物:公共单元格
障碍物
包含一个纯虚拟析构函数。现在在
Cell
类中,我想实现一个方法
boolcell::isAccessible()
。我已经按照如下方式实现了这一点:

bool Cell::isAccessible() {

    Obstacle *obs = dynamic_cast<Obstacle*>(this);

    if (obs != NULL) return false;
    return true;
}
bool Cell::isAccessible(){
障碍物*obs=动态施法(本);
如果(obs!=NULL)返回false;
返回true;
}
但是,我返回了以下错误:

“运行时动态\u转换的操作数必须具有多态类 类型”


我想要实现这一点的方式有什么问题?欢迎提供任何指导。

单元类必须至少有一个虚拟函数才能使用动态\u cast。另外,如果Cell是基类,它应该有一个虚拟析构函数


您应该使isaccess成为一个虚拟函数,并在障碍中覆盖它以返回false。

您所做的是错误的。通常,您不需要强制转换到基类中类的子类型。如果需要,可能是设计错误。在您的例子中,代码应该如下所示

virtual bool Cell:: isAccessible()
{
  return true;
}

bool Obstacle::isAccessible()
{
  return false;
}

另外,导致错误的原因是,
单元格
类没有虚拟方法,因此它没有显示多态行为。

这与visual studio有关吗?这是他们的错误吗?(我之所以这样问是因为标签)为什么你要在一个单元格方法中对障碍物施放单元格?这似乎是解决这个问题的一个复杂方法。如果
isAccessible
是一个虚拟方法,那么
障碍
可以覆盖它并简单地返回false,这将不再是一个问题。我不知道您试图做什么,但错误是因为您的Cell类不是多态的,即它没有任何虚拟方法。如果你将一个虚拟方法添加到单元格中,你的代码应该编译。在java或<代码> <动态代码> /COD> >中使用<代码> <代码>,在C++中执行类型切换是你首先应该避免的。您正在创建循环依赖项,因为基础需要了解派生的依赖项,反之亦然。谢谢。然而,除了我试图以错误的方式(通过强制转换)解决问题之外,为什么Cell必须至少有一个虚拟方法才能使用动态强制转换?@tim_动态强制转换和虚拟函数需要在对象中嵌入一些信息,但这会略微增加其大小,因此C++允许您选择是否添加信息。