【问题标题】:Down Casting a Hierarchy with Nonpolymorphic Types向下转换具有非多态类型的层次结构
【发布时间】:2011-01-31 02:46:41
【问题描述】:

这完全是在 C 中。

假设您有一个基本结构和两个其他派生结构。这些派生结构不是从经典意义上派生的(即:A : B),而是仅包含基本类型的结构。因此,如果结构 A 是基础结构且 B 是 2 个派生结构之一,则 B 将具有类型 A 的成员。像这样:

struct A {
     // blah blah...
};

struct B {
     A part_a;
     // more stuff...
}

struct C {
     A part_a;
     // SO MUCH STUFF
}

假设你有一个函数,A_downcast_B,像这样:

B * A_downcast_B(A * a)
{
     // downcast the A* here somehow
}

如果'a' 无法成功向下转换为B 类型的结构,您希望此函数返回0-1。例如,如果 C 类型的“派生”结构有一个指向它的 A* 类型的指针,并且该指针被传递给此函数,则该函数将返回 0-1null .

有没有办法做到这一点?我已经考虑了几个小时了,这让我很困惑。

【问题讨论】:

    标签: c casting struct


    【解决方案1】:

    struct A 中不嵌入某种运行时类型信息是不可能的。例如,您可以存储指向某种类型信息的指针,并且您必须在创建任何“派生”结构时对其进行初始化。

    struct RTTI {
      const char *typename;
      // etc.
    };
    
    struct A {
      const RTTI *rtti;
      // rest of A
    };
    
    struct B {
      A part_a;
      ...
    };
    
    const RTTI RTTI_B = {"B"};
    
    struct C {
      A part_a;
      ...
    };
    
    const RTTI RTTI_C = {"C"};
    
    void make_B(B *b)
    {
      b->part_a.rtti = &RTTI_B;
      // make the rest of B
    }
    
    void make_C(C *c)
    {
      c->part_a.rtti = &RTTI_C;
      // make the rest of C
    }
    
    B * A_downcast_B(A * a)
    {
       return (a->rtti == &RTTI_B) ? (B*)a : NULL;
    }
    

    请注意,这实际上只是 C++ 的 dynamic_cast 运算符的简化实现,它仅适用于多态数据类型。这样做的原因是,如果对象中嵌入了某种类型的信息——它的 vtable,运行时才能访问运行时类型信息。

    【讨论】:

    • 哦,这就是 RTTI 所代表的。该死的我懒惰不让我谷歌它大声笑。非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多