10

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

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

...

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

对象的内存布局:

[ derived part | base part ]

我知道向上转换被认为是“安全的”,但是当继承是虚拟的时,编译器如何知道编译时基本子对象的偏移量?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指向的实际动态类型呢?

4

1 回答 1

3

当您有一个指向 a 的指针时Derived,很清楚Base要使用哪个,您甚至可以将指针隐式转换为Derived指向Base! 如果需要任何地址调整,编译器将弄清楚如何使用嵌入式指针、vtable 或其他方式进行调整:C++ 标准没有规定确切的方法。具体做什么取决于 ABI。例如,对于Itanium C++ ABI,虚拟基础的偏移量似乎存储在虚拟表中。

于 2013-07-28T23:53:45.213 回答