【问题标题】:Is there a way to return a child* to a base* and evaluate which child* has been returned?有没有办法将 child* 返回到 base* 并评估哪个 child* 已返回?
【发布时间】:2013-04-04 07:39:07
【问题描述】:

我试过这个没用:

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

【问题讨论】:

    标签: c++ oop class pointers inheritance


    【解决方案1】:

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

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

    请注意,动态向下转换有时表明设计不佳。试着想想在你的层次结构中更好地安排虚函数是否会有所帮助。

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

    【讨论】:

    • @MickaelBergeronNéron:很高兴它有帮助:)
    • 我正在创建一个地图编辑器。在某些时候,我希望通过单击地图来将一个图块更改为另一个图块。在其他时候,我会想提高或降低高度,或者在我的瓷砖上添加对象。 SObject 是在单击地图之前选择的可选择对象。如果 SObject 实际上是 SOTile,则单击地图不会像 SObject 是要添加到图块上的装饰一样。那么,有了这些信息,你能帮助我吗?
    • 算了,我刚刚找到了解决办法。毕竟这比我想象的要简单得多。还是谢谢。
    • @MickaelBergeronNéron:好的,抱歉我回答得不够快:)
    【解决方案2】:

    dynamic_cast operator 在类为多态时执行特殊检查。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        由于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 将在编译时失败。

        【讨论】:

          猜你喜欢
          • 2018-06-24
          • 1970-01-01
          • 2022-11-29
          • 2021-09-21
          • 2014-05-09
          • 1970-01-01
          • 2013-05-22
          • 2011-08-24
          • 2013-02-19
          相关资源
          最近更新 更多