static_cast如何与虚拟继承一起使用?

时间:2013-07-28 23:35:30

标签: c++ oop virtual-inheritance static-cast

因此,使用static_cast进行虚拟继承转发是不可能的,但是如何进行以下向上转换:

class Base {...};
class Derived : public virtual Base {...};

...

Derived *d = new Derived();
Base *b = static_cast<Base*>(d);

对象的内存布局:

[ derived part | base part ]

我知道upcasting被认为是“安全的”,但是当继承是虚拟的时候,编译器如何知道编译时对基础子对象的偏移? static_cast是否使用vtable

当我们有这样的事情时,这尤其令人困惑(注意它不是虚拟的):

class Third : public Derived {...};

...

Derived *d = new Third();            // non-virtual upcast, no offset will be added
Base *b = static_cast<Base*>(d);

这次我使用了相同的static_cast行,但Base子对象的偏移量不同了!

对象的内存布局:

[ derived part | third part | base part ]

那么如何在编译时确定它是否取决于对象的实际动态类型d指向?

1 个答案:

答案 0 :(得分:3)

当你的情况下有一个指向Derived的指针时,很明显要使用哪个Base,你甚至可以隐式地将指针转换为Derived指向Base!如果需要进行任何地址调整,编译器将使用嵌入式指针,vtable或其他方法来确定如何执行此操作:C ++标准未规定确切的方法。完成的工作取决于ABI。例如,对于Itanium C++ ABI,虚拟基础的偏移似乎存储在虚拟表中。