наследование — опишите, почему преобразование указателя базового класса в указатель производного класса не допускается в переполнении стека

У меня есть смутное представление о том, почему это не разрешено, но я ищу что-то более конкретное.
Я предполагаю, что это как-то связано с тем фактом, что все методы в базовом классе не обязательно должны быть виртуальными.

Может кто-нибудь мне помочь?

0

Решение

Ваш производный класс может определять новые методы и атрибуты, которые неизвестны в вашем базовом классе. Джава&Ко бросит исключение в таких обстоятельствах.

В C ++ вы можете (но редко должны) явно приводить указатель на базовый класс к производному с помощью статического приведения. Неизвестно, что произойдет, если исходный указатель будет указывать на объект базового класса или другой производный класс.

Посмотрите на awnser Влада Лазаренко для примера, как это сделать.

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector