我是否应该期望单继承中的upcast和downcast不调整指针?

时间:2016-01-25 13:33:01

标签: c++ pointers inheritance casting portability

假设我有:

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)); 吗?

我知道大多数实现都是以这种方式工作但是有保证吗?

2 个答案:

答案 0 :(得分:2)

你应该期待什么"可以与保证的不同。

继承链的static_cast向上或向下可以更改地址。

在实践中发生这种情况的规范示例是基类是非多态的,而派生类引入了一些虚函数,然后许多编译器在每个派生对象的开头引入一个vtable指针。

答案 1 :(得分:2)

我认为处理此问题的标准部分是§5.2.9(13)

哪个(简而言之)表明T *强制转换为void *然后返回T *将引用同一个对象。

但没有规定Derived的地址必须与其Base的地址相同。

所以我的答案是,“没有 - 代码期望这种等效性是格式错误引发未定义的行为”。