描述在C ++中不允许将基类指针转换为派生类指针的原因

时间:2012-11-19 16:24:27

标签: c++ inheritance

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

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

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

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

请参阅Vlad Lazarenko的照片,了解如何做到这一点。