У меня есть смутное представление о том, почему это не разрешено, но я ищу что-то более конкретное.
Я предполагаю, что это как-то связано с тем фактом, что все методы в базовом классе не обязательно должны быть виртуальными.
Может кто-нибудь мне помочь?
Ваш производный класс может определять новые методы и атрибуты, которые неизвестны в вашем базовом классе. Джава&Ко бросит исключение в таких обстоятельствах.
В C ++ вы можете (но редко должны) явно приводить указатель на базовый класс к производному с помощью статического приведения. Неизвестно, что произойдет, если исходный указатель будет указывать на объект базового класса или другой производный класс.
Посмотрите на awnser Влада Лазаренко для примера, как это сделать.
Трудно описать, почему это не разрешено, потому что на самом деле это в значительной степени разрешено.
#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);
}