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