c++ - 标准安全类型检查?

标签 c++ rtti

在我的 IsSame 函数中,如果两个指针都指向相同类型 的对象,我想返回 true。所以只有中间调用应该返回 trueD1B 不应被视为相同。

以下似乎正是我想要的,但根据标准,它安全吗?

#include <stdio.h>

class B { virtual void foo() {} };
class D1 : public B { };
class D2 : public B { };
class D3 : public B { };

bool IsSame(B*a, B*b) {
    if (a == 0 || b == 0)
        return false;
    return *(intptr_t*)a == *(intptr_t*)b;
}

int main() {
    D1 d1;
    D2 d2;
    D1 d1b;
    B b;
    printf("%d %d %d\n", IsSame(&d1, &d2), IsSame(&d1, &d1b), IsSame(&d1, &b));
}

输出:

0 1 0

最佳答案

您正在尝试查看这两个对象是否具有相同的 v 表。 C++ 标准没有提到 v 表指针的存在,更不用说它在对象布局中的位置了。因此,您的解决方案是非常不标准的,并且您的程序的行为实际上是未定义的。

如果您想查看两个基指针是否具有相同的派生类型但没有 RTTI,您将需要某种机制让您知道派生类型的 ID。这可能意味着一个虚拟方法返回一个所有派生类型都必须实现的 id。

关于c++ - 标准安全类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16204270/

相关文章:

delphi - 在运行时复制组件

c++ - 我可以在我的代码库中有选择地禁用 RTTI 以减小二进制文件的大小吗?

c++ - Racket 作为游戏引擎中的脚本语言

c++ - Qt 项目中的 unique_ptr

c++ - 使用基于概念的递归函数模板在扣除 'auto [...] ' 之前使用 'auto'

java instanceof 和 ocaml 匹配

c++ - Itanium 和 MSVC ABI 中跨模块边界的 RTTI

c++ - 在 C++ 程序中并行化 C 代码模块

c++ - 如何使用不同的函数计算三个数字的总和、平均值和乘积

c++ - 指向 typeinfo::name() 的内存的生命周期是多少?