【发布时间】:2016-04-08 19:12:48
【问题描述】:
阅读C++: Comparing pointers of base and derived classes 后,我认为这肯定行不通。
当我执行此操作时,c_as_b 和 &c 的打印地址不同,那么为什么此打印“在比较同一层次结构中的指针似乎是安全的”?除了打印的地址之外,还有什么比较可能导致真实?
你能举一个==导致错误的类似小例子吗?
#include <iostream>
using namespace std;
struct A { std::string s; };
struct B { int i; };
struct C : A, B { double d; };
int main() {
C c;
B* c_as_b = &c;
A* c_as_a = &c;
cout << "c_as_a: " << c_as_a << endl
<< "c_as_b: " << c_as_b << endl
<< "&c: " << &c << endl;
cout << (c_as_b == &c ? "seems safe to compare pointers in same hierarchy" : "definately not safe") << endl;
return 0;
}
样本输出:
c_as_a: 0xbfb98f10
c_as_b: 0xbfb98f14
&c: 0xbfb98f10
seems safe to compare pointers in same hierarchy
【问题讨论】:
-
我不知道这方面的标准,但看起来
&c上可能有一个隐含的dynamic_cast,以便在比较之前将其转换为B* -
dynamic_cast 可能很昂贵,并且永远不会隐式完成
-
"除了打印出来的地址外,还有什么比较可能为真?" 两个指针被静态转换为通用类型后。
-
@vu1p3n0x,这里不能动态转换,没有虚函数。
-
@EdHeal 嗯,与其他类型的石膏相比,它的价格昂贵。
标签: c++ pointers inheritance