这完全是在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
}
Run Code Online (Sandbox Code Playgroud)
假设你有一个函数A_downcast_B,就像这样:
B * A_downcast_B(A * a)
{
// downcast the A* here somehow
}
Run Code Online (Sandbox Code Playgroud)
您希望此函数返回,0或者-1如果'a'无法成功下载到类型的结构B.因此,例如,如果类型的'派生'结构C具有指向它的类型的指针A*,并且该指针被传递给此函数,则该函数将返回0,-1或null.
有没有办法做到这一点?我已经考虑了几个小时了,这让我很难过.
没有嵌入某种运行时类型信息是不可能的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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,这实际上只是C++ dynamic_cast运算符的简化实现,它只适用于多态数据类型.这就是为什么运行时只能访问运行时类型信息,如果对象中嵌入了某种类型信息 - 它的vtable.
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |