【问题标题】:C++ Static_cast over a pointer to virtual base classC++ Static_cast 通过指向虚拟基类的指针
【发布时间】:2016-10-27 03:40:07
【问题描述】:

在几乎完全使用 C++ 进行了大约 6 到 7 年的编程之后,我发现:

struct A
{
   virtual ~A() = 0; // Abstract class
};

A::~A() {}

struct B : virtual A
{};

int main()
{
    A* a = new B;
    (void)static_cast<B*>(a);

    return 0;
}

抛出编译器错误,因为标准不允许从指向虚拟基类的指针进行静态转换。我认为这与与虚拟基类关联的内存布局有关,但我想知道详细信息。

【问题讨论】:

  • 你的代码编译;你不是说struct B : public virtual A吗?
  • 感谢您的警告。解决了(是的,我的意思是)

标签: c++ casting downcast virtual-inheritance static-cast


【解决方案1】:

原因是virtual AB 中的内存映像和A 的内存映像可能不同。如果不让它有所不同,就无法解决众所周知的“大胆钻石”(嗯,至少不容易,因为我们不能要求A 意识到这一点并设置一个对我们来说更可取的 ABI)。将virtual A 视为对B 中的每个函数和A 的成员访问具有一个虚函数。它不一定是这样实现的,但你可以这样建模。

【讨论】:

    猜你喜欢
    • 2013-10-13
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2015-08-12
    • 1970-01-01
    • 2015-12-17
    相关资源
    最近更新 更多