C++中IsA()的重点是什么?

Set*_*ron 4 c++ polymorphism

我试图找出为什么一些代码库使用IsA()来确定对象多态性,如果在C++中你已经可以安全地进行上传和下调(使用dynamic_cast)?

到目前为止,我认为唯一有用的案例是当你整合一个链接到c ++代码库的脚本环境时?

谢谢!

Ecl*_*pse 8

在C++中IsA(),几乎没有什么理由可以使用,甚至dynamic_cast<>()是需要的功能.这类代码的最糟糕的例子是dynamic_casttype字段上使用s或switch语句的巨大if-then语句.这些代表了维护的噩梦,添加类可能涉及更新数十个或数百个不同的位置以支持新类.

例如:

坏:

// 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";
}
Run Code Online (Sandbox Code Playgroud)

更好:

void PrintName(Base *b, ostream &o)
{
   o << b->GetName();
}
Run Code Online (Sandbox Code Playgroud)

这显然是在检查null,并使用智能指针等.同样,如果您要查询类型以在不同行为之间进行选择,您需要询问为什么要为每种类型执行不同的操作,并移动该行为决定进入对象.

坏:

// 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
    }
}
Run Code Online (Sandbox Code Playgroud)

更好:

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; }
Run Code Online (Sandbox Code Playgroud)


Che*_*Alf 5

在现代C++中没有任何意义.

在1998年标准化之前的框架可以提供IsA功能.

例如,我记得在MFC中有这样的功能.

另外,正如您所指出的,当处理用其他语言实现的对象(类型不是由C++类型表示)时,它可能是有用的.

干杯&hth.,