是否有一种方法可以将子*返回到基数*并计算返回的子*是哪个?

Is there a way to return a child* to a base* and evaluate which child* has been returned?

本文关键字:返回 计算 方法 一种 是否      更新时间:2023-10-16

我试过了,但没有成功:

void Map::OnLMClick(short xPos, short yPos)
{
    SObject* pSObject = pEditWindow->GetSelectedItem();
    if (pSObject==SOTile)
    {
       /* Do */

我试了这个作为一个测试:

SObject* EditorWindow::GetSelectedItem()
{
    return pSOTile[1]; //pSOTile[1] is a valid pointer, member of EditorWindow
}

SOTile类是基类SObject的子类。那么,是否有可能创建一个Base*来返回它的一个子*,然后让程序根据它返回的子*做出不同的反应?如果是这样的话,我怎样才能访问它的子元素而不是base的成员呢?

如果你的类型是多态的(即,如果它们至少有一个虚函数),你可以使用dynamic_cast:

Base* pObject = get_object(); // May return a pointer to Derived
Derived* pDerived = dynamic_cast<Derived*>(pObject);

请注意,动态向下转换有时是糟糕设计的指示符。试着想想在层次结构中更好地安排虚函数是否会有所帮助。

如果不了解具体的应用领域,我不可能给出更具体的建议。

dynamic_cast操作符在类为多态时执行特殊检查。

   SOTile* pSOTile = dynamic_cast<SOTile*>(pSObject);
   if (pSOTile)
   {
      /* Do */
   } 

由于SOTile是一个指针的类型派生自SObject,你应该不需要强制转换,因为编译器应该能够自动解析一个SObject指针从派生的指针,然后比较两个SObject指针在一起(同样的方式,你可以分配一个派生指针到一个基指针没有类型强制转换)。有些编译器,比如Borland的编译器,很好地支持这个,例如:

class Base
{
};
class Derived : public Base
{
};
Derived *d = ...;
Base *b = ...;
if (b == d) // <-- compiles fine

但是,如果由于某种原因编译器不允许这样做,您可以使用static_cast手动转换派生指针(不要使用dynamic_cast转换基指针):

if (pSObject == static_cast<SObject*>(SOTile))

如果SOTile不是指向SObject派生类型的指针,则static_cast将在编译时失败。

我不建议使用dynamic_cast。相反,您可以在不同的子类中实现不同的行为。有时称为"模板方法"模式