假设我有:
Derived* object = new Derived();
Base* base = object; //implicit conversion here
void* derivedVoid = object;
void* baseVoid = base;
我的代码是这样的:
baseVoid == derivedVoid
我应该期待 float f = 125.0f;
DecimalFormat form = new DecimalFormat("0.00");
System.out.println(form.format(f));
吗?
我知道大多数实现都是以这种方式工作但是有保证吗?
答案 0 :(得分:2)
你应该期待什么"可以与保证的不同。
继承链的static_cast
向上或向下可以更改地址。
在实践中发生这种情况的规范示例是基类是非多态的,而派生类引入了一些虚函数,然后许多编译器在每个派生对象的开头引入一个vtable指针。
答案 1 :(得分:2)
我认为处理此问题的标准部分是§5.2.9(13)
哪个(简而言之)表明T *强制转换为void *然后返回T *将引用同一个对象。
但没有规定Derived
的地址必须与其Base
的地址相同。
所以我的答案是,“没有 - 代码期望这种等效性是格式错误引发未定义的行为”。