1

我试过这个没有用:

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 成员的子成员?

4

4 回答 4

3

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

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

请注意,动态向下转换有时是糟糕设计的标志。尝试考虑在您的层次结构中更好地安排虚拟功能是否会有所帮助。

在不了解具体应用领域的情况下,我无法给出更具体的建议。

于 2013-04-11T22:44:47.110 回答
1

dynamic_cast 运算符在类是多态时执行特殊检查。

   SOTile* pSOTile = dynamic_cast<SOTile*>(pSObject);
   if (pSOTile)
   {
      /* Do */
   } 
于 2013-04-11T22:48:37.533 回答
1

由于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))

IfSOTile不是指向派生自 的类型的指针SObjectstatic_cast将在编译时失败。

于 2013-04-11T23:25:58.087 回答
0

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

于 2013-04-11T22:57:23.793 回答