在我的 IsSame
函数中,如果两个指针都指向相同类型 的对象,我想返回 true
。所以只有中间调用应该返回 true
。 D1
和 B
不应被视为相同。
以下似乎正是我想要的,但根据标准,它安全吗?
#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/