1

在这个程序中:

    class Top
    {
            public:
            int a;
    };

    class Left : virtual public Top
    {
            public:
            int b;
    };

    class Right : virtual public Top
    {
            public:
            int c;
    };

    class Bottom : public Left, public Right
    {
            public:
            int d;
    };

    class AnotherBottom : public Left, public Right
    {
            public:
            int e;
            int f;
    };

    int main()
    {
        Bottom* bottom1 = new Bottom();
        AnotherBottom* bottom2 = new AnotherBottom();
        Top* top1 = bottom1;
        Top* top2 = bottom2;
        Left* left = static_cast<Left*>(top1);
        return 0;
    }

我对这个程序几乎没有疑问:

在执行 static_cast 时,编译器会给出错误

error: cannot convert from base ‘Top’ to derived type ‘Left’ via virtual base ‘Top

即使在动态转换中,它也会给出错误

error: cannot dynamic_cast ‘top1’ (of type ‘class Top*’) to type ‘class Left*’ (source type is not polymorphic)

因此,在 Top 类中添加虚拟析构函数时,它变成了多态并且允许动态转换。

我无法理解为什么会这样。

4

1 回答 1

2

演员不能静态完成。想象一个类实际上继承自 Top(可能多次)和 Left。布局取决于该类的详细信息。因此,仅给定 Top 实例的位置,就没有一种已知的方法可以计算出 Left 实例的数据在哪里。

解决方案是将信息嵌入对象本身(通常作为 vtable 的一部分),然后动态进行计算。因此,您可能会包含一些数据,说“我真的是 Left 的一个实例,而我的 Top 基本实例距离我的 this 指针指向的位置 12 个字节”。

但是 C++ 不希望每个对象都被强制保存该信息,因为它通常是不需要的。它只需要由多态类存储,这些类(这不是巧合)正是那些无论如何都需要有一个 vtable 的。

于 2012-05-12T20:22:14.857 回答