c++ - C++ 中 IsA() 的意义何在?

标签 c++ polymorphism

如果在 C++ 中您已经可以安全地向上转型和向下转型(使用 dynamic_cast),我想弄清楚为什么一些代码库使用 IsA() 来确定对象多态性?

到目前为止,我认为唯一有用的情况是当您正在集成一个链接到 c++ 代码库的脚本环境时?

谢谢!

最佳答案

IsA() 的原因很少功能,甚至是 dynamic_cast<>()在 C++ 中需要。此类代码最糟糕的例子是使用 dynamic_cast 的巨大 if-then 语句。 s 或 type 上的 switch 语句 field 。这些代表了维护噩梦,其中添加类可能涉及更新数十个或数百个不同位置以支持新类。

例如:

差:

// Don't do this:
void PrintName(Base *b, ostream &o)
{
   if (dynamic_cast<DerivedA *>(b) != NULL)
      o << "Derived A";
   if (dynamic_cast<DerivedB *>(b) != NULL)
      o << "Derived B";
   if (dynamic_cast<DerivedC *>(b) != NULL)
      o << "Derived C";
}

更好:

void PrintName(Base *b, ostream &o)
{
   o << b->GetName();
}

这显然省略了空值检查和使用智能指针等。同样,如果您查询类型以在不同行为之间进行选择,则需要询问为什么要为每种类型做不同的事情,并且将该行为决定移动到对象中。

差:

// Don't do this:
void ObjectBase::ApplyForceToObject(const Force &f)
{
    if (dynamic_cast<Wall*>(this) != NULL
        || dynamic_cast<Floor*>(b) != NULL)
    {
        // Do nothing
    }
    else
    {
        // Accelerate object
    }
}

更好:

void ObjectBase::ApplyForceToObject(const Force &f)
{
    if (IsFixedObject())
    {
        // Do nothing
    }
    else
    {
        // Accelerate object
    }
}
...
bool ObjectBase::IsFixedObject() { return false; }
bool Wall::IsFixedObject() { return true; }
bool Floor::IsFixedObject() { return true; }

关于c++ - C++ 中 IsA() 的意义何在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4128113/

相关文章:

c++ - QT 5.3 配置命令的位置

c++ - 弃用 C++ 中类的旧名称

C++ 结合静态和动态多态性来创建 "Hyper Polymorphism"?

java - 如何显示数组列表中对象的实例? (多态性)

java - 在同一列表中返回两个不同的 bean

c++ - QT5.3 如何将我的 Qobject 添加到 QQmlEngine 并通过 QML 访问它的属性?

c++ - 模板类的模板 friend 的问题

c++ - CLion with Cygwin : g++. exe .../compiler-arguments.txt: No such file or directory 错误

c++ - boost::any 违反了 Liskov 替换原则

c++ - 如何在基类指针 vector 的元素上应用重载的多态函数