我对为什么不允许这样做有一个模糊的想法,但我正在寻找更具体的东西。我假设它与基类中的所有方法可能不一定是虚拟的事实有关。
谁能帮我吗?
很难描述为什么不允许这样做,因为事实上它几乎是允许的。
#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);
}
您的派生类可能会定义新的方法和属性,这些在您的基类中是未知的。Java&Co 在这种情况下会抛出异常。
在 C++ 中,您可以(但很少应该)通过静态转换将指向基类的指针显式转换为派生类。如果原始指针指向基类或另一个派生类的对象,会发生什么是未定义的。
请参阅 Vlad Lazarenko 的 awnser 以了解如何执行此操作的示例。