我有一个模糊的想法,为什么不允许这样做,但我正在寻找更具体的东西。 我假设它与基类中的所有方法可能不一定是虚拟的事实有关。
任何人都可以帮助我吗?
答案 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的照片,了解如何做到这一点。