0

我对为什么不允许这样做有一个模糊的想法,但我正在寻找更具体的东西。我假设它与基类中的所有方法可能不一定是虚拟的事实有关。

谁能帮我吗?

4

2 回答 2

1

很难描述为什么不允许这样做,因为事实上它几乎是允许的。

#include <cstdio>

struct Base {
    int b;
    explicit Base(int b) : b(b) {}
};

struct Derived : Base {
    int d;
    explicit Derived(int d) : Base(d), d(d+1) {}
};

int main()
{
    Derived d(10);
    Base *b = &d;
    Derived *d2 = static_cast<Derived *>(b);

    printf("%d, %d\n", b->b, d2->d);
}
于 2012-11-19T16:30:27.913 回答
1

您的派生类可能会定义新的方法和属性,这些在您的基类中是未知的。Java&Co 在这种情况下会抛出异常。

在 C++ 中,您可以(但很少应该)通过静态转换将指向基类的指针显式转换为派生类。如果原始指针指向基类或另一个派生类的对象,会发生什么是未定义的。

请参阅 Vlad Lazarenko 的 awnser 以了解如何执行此操作的示例。

于 2012-11-19T16:32:47.160 回答