Не может понизить, потому что класс не полиморфен?


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

Пример:

Class A(){
    int a;
    int getA(){return a;};
}


Class B(): A(){
    int b;
    int getB(){return b;};
}

В другом классе мы пытаемся перейти от Объекта A к объекту B:

 A *a;
 B *b = dynamic_cast<B*>(a)

Но это дает следующую ошибку:

 cannot dynamic_cast ... (source type is polymorphic)
5 35

5 ответов:

Синтаксические ошибки не выдерживают, вы не можете dynamic_cast неполиморфный тип. static_cast - это приведение, которое вы бы использовали в этом случае, если бы знали, что это на самом деле объект целевого типа.

Причина почему: static_cast в основном компилятор выполняет проверку во время компиляции "может ли вход быть приведен к выходу?"Это может быть использовано для случаев, когда вы бросаете вверх или вниз иерархию наследования указателей (или ссылок). Но проверка происходит только во время компиляции, а компилятор предполагается, что вы знаете, что делаете.

dynamic_cast может использоваться только в случае приведения указателя или ссылки, и в дополнение к проверке времени компиляции он выполняет дополнительную проверку времени выполнения, что приведение является законным. Это требует, чтобы рассматриваемый класс имел по крайней мере 1 виртуальный метод, который позволяет компилятору (если он поддерживает RTTI) выполнить эту дополнительную проверку. Однако если рассматриваемый тип не имеет виртуальных методов, то он не может быть использован.

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

Для успешного применения оператора dynamic_cast в классе требуется по крайней мере один виртуальный метод.

Просто сделайте деструктор виртуальным (всегда делайте для любого класса просто для безопасности).

Да, dynamic_cast для неполиморфных типов не допускается. Базовый класс должен иметь по крайней мере один виртуальный метод. Только тогда этот класс можно назвать полиморфным.

В этой статье описывается аналогичный пример: http://www.cplusplus.com/doc/tutorial/typecasting/

A a;
B *b = dynamic_cast<B*>(a)

Здесь a-объект, А b-указатель.

На самом деле, как восходящая, так и нисходящая передача разрешены в C++. Но при использовании downcasting, 2 вещи должны быть обращены внимание: 1 суперкласс должен иметь по крайней мере один виртуальный метод. 2 так как суперкласс "меньше", чем подкласс, следует использовать объект памяти осторожно.