我应该期望单继承中的向上转换和向下转换不会调整指针吗?

Posted

技术标签:

【中文标题】我应该期望单继承中的向上转换和向下转换不会调整指针吗?【英文标题】:Should I expect that upcasts and downcasts in single inheritance don't adjust the pointer? 【发布时间】:2016-01-25 13:33:01 【问题描述】:

假设我有:

class Base 
public:
    virtual void Nothing() 
;
class MiddleDerived : public Base 
    virtual void Nothing() 
;
class Derived : public MiddleDerived 
    virtual void Nothing() 
;

我的代码是这样的:

Derived* object = new Derived();
Base* base = object; //implicit conversion here

void* derivedVoid = object;
void* baseVoid = base;

我应该期待baseVoid == derivedVoid吗?

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

【问题讨论】:

考虑用“语言律师”代替“可移植性”吗? 当您提出问题(而不是示例)时,您留下了基类可能没有任何虚拟方法(而某些派生类有)的可能性。这仍然可以是“单一继承”,但指针将 not 相等。对于您的示例,我不是一个足够优秀的语言律师来支持我的信念,即这仅在普遍实践中是正确的,而不是标准所承诺的。 我认为这应该可行,但我认为非 POD 类没有标准布局。 【参考方案1】:

您“应该期望”的可能与保证的不同。

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

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

【讨论】:

【参考方案2】:

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

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

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

所以我的回答是,“不 - 期望这种等效的代码是 ill-formed 邀请未定义的行为”。

【讨论】:

以上是关于我应该期望单继承中的向上转换和向下转换不会调整指针吗?的主要内容,如果未能解决你的问题,请参考以下文章

向上强制转换和向下强制转换

继承--方法覆盖--多态

java向上转型和向下转型

C++:派生模板类和基类之间的向下转换和向上转换?

Java-泛型的作用

Object 向下转型