2010-08-05 2 views
3

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

struct m 
{ 
    virtual int s() 
    { 
     return 1; 
    } 
}; 

struct n : public m 
{ 
    int s() 
    { 
     return 2; 
    } 
}; 

int o() 
{ 
    n* p=new m; 
    m* q=dynamic_cast<p>; 
    return q->s(); 
} 
+2

Вы должны указать, какую ошибку вы получите при запуске кода. –

+0

Напиши такой код, если ты хочешь стать следующей жертвой калашниковых-разрушителей-сотрудников № 1. Зачем вам здесь нужен dynamic_cast? – jpinto3912

+0

Вам, разумеется, не нужно 'dynamic_cast' для вызова виртуальной функции. В этом весь смысл виртуальных функций. И всегда проверяйте, чтобы бросок преуспел до того, как вы разыщите указатель. –

ответ

7

Эти C++ отданных операторы должны быть использованы в качестве

dynamic_cast<newType>(variable) 

В вашем случае,

m* q = dynamic_cast<m*>(p); 

BTW, вы путаете роль m и n? n* p = new m является синтаксической ошибкой, потому что экземпляр базового класса не может быть неявно преобразован в экземпляр производного класса. Фактически, база →, полученная , является ситуацией, в которой вы действительно нуждаетесь dynamic_cast, а не наоборот (не требуется литье).

Также рассмотрите вопрос о предоставлении значимых имен объектам.

2

В следующий раз, пожалуйста, сообщите нам, какая ошибка!

Я полагаю, вы говорите, что есть ошибка компиляции, потому что вы не используете dynamic_cast правильно? Вероятно, вы хотели сказать:

m* q=dynamic_cast<m *>(p); 

В целом, dynamic_cast - это дьявол. Большинство реализаций безумно медленны и могут идти вплоть до проверки имени класса на основе строк. Если вы действительно не нуждаетесь в использовании dynamic_cast, используйте любой другой доступный метод (например, static_cast).

+0

http://www.boost.org/doc/libs/1_43_0/libs/conversion/cast.htm имеет лучшее из обоих бросков. – smerlin

0

Две проблемы: сначала вы не можете выделить m и называть его n в первой строке основного. У вас есть синтаксическая ошибка в dynamic_cast. Это dynamic_cast<new type>(some var).

Смежные вопросы