Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > динамическое приведение типов


Автор: Волод 30.8.2005, 12:48
Опять не компилируется!!!
В книге Лафоре есть вот такой пример кода:
Код

//dyncast2.cpp
//Тестирование динамического приведения типов
//RTTI должен быть включен
#include <iostream>
#include <typeinfo>          //для dynamic_cast
using namespace std;
///////////////////////////////////////////////////////////
class Base
  {
  protected:
    int ba;
  public:
    Base() : ba(0)
      {  }
    Base(int b) : ba(b)
      {  }    
    virtual void vertFunc()  //для нужд dynamic_cast
      {  }
    void show()
      { cout << "Base: ba=" << ba << endl; }
  };
///////////////////////////////////////////////////////////
class Derv : public Base
  {
  private:
    int da;
  public:
    Derv(int b, int d) : da(d)
      { ba = b; }
    void show()
      { cout << "Derv: ba=" << ba << ", da=" << da << endl; }
  };
////////////////////////////////////////////////////////////////
int main()
  {
  Base* pBase = new Base(10);     //указатель на Base
  Derv* pDerv = new Derv(21, 22); //указатель на Derv

  //приведение к базовому типу: восхождение  по дереву –
  //указатель поставлен на подобъект Base класса Derv
  pBase = dynamic_cast<Base*>(pDerv);
  pBase->show();                  //"Base: ba=21"

  pBase = new Derv(31, 32);       //обычное нисходящее
   //приведение типов -- pBase должен указывать на Derv)
  pDerv = dynamic_cast<Derv*>(pBase);
  pDerv->show();                  //"Derv: ba=31, da=32"
  return 0;
  }

Компилятор такой код пропускает, хотя и выдает предупреждение на строке
pDerv = dynamic_cast<Derv*>(pBase);
, а вот во время исполнения программы, именно на этой строке программа вылетает…
В чем причина? Использую VC++ 6 SP6

Автор: zhgutov 30.8.2005, 13:03
А у меня все работает. Компиляторы Intel C++ 8.1, VC++ 7. Старый компилятор имел свойство выдавать кучу глюков. Например при написании шаблона функции сортировки он мне выдал внутреннюю ошибку! Не исключено, что дело именно в нем.

Автор: Void 30.8.2005, 20:50
Цитата
Компилятор такой код пропускает, хотя и выдает предупреждение на строке
pDerv = dynamic_cast<Derv*>(pBase);

Скорее всего, предупреждение содержало в себе вполне четкое сообщение о том, что не включен RTTI и нужно компилировать код с соотвествующим ключом. Для 7-ки это -GR, для 6-ки, думаю, то же самое.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)