Я столкнулся с этой проблемой случайно, когда перебирал наследование и приведение вверх / вниз.Почему это не разрешено (код прокомментирован, чтобы показать разделы, которые не разрешены)?Теперь я могу догадаться, почему это не разрешено, но фактический ответ был бы великолепен.
Что касается кода, который разрешен , я знаю, что это потому, что (Base *) - это приведение в стиле C, которое по сути является reinterpret_cast в C ++, что, в свою очередь, означает, что в этом случае это приведет к неопределенному поведению.Пожалуйста, поправьте меня, если я ошибаюсь.
class Base
{
};
class Derived : public Base
{
};
class DerivedProt : protected Base
{
};
class DerivedPriv : private Base
{
};
int main()
{
Base* a = new Derived();
Base* b = new DerivedProt(); // Not allowed
Base* c = new DerivedPriv(); // Not allowed
Base* d = (Base*) new DerivedProt(); // Allowed but undefined behavior...?
Base* e = (Base*) new DerivedPriv(); // Allowed but undefined behavior...?
}