typeid без vtbl

Тема в разделе "LANGS.C", создана пользователем _DEN_, 25 май 2007.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Код (Text):
    1. #include <iostream>
    2.  
    3. struct base
    4. {
    5. };
    6.  
    7. struct derived : public base
    8. {
    9. };
    10.  
    11. int main()
    12. {
    13.     base* ptr = new derived;
    14.     std::cout << typeid(*ptr) << std::endl;
    15.     return 0;
    16. }
    Если у base нет виртуальных функций, то typeid не понимает что за ptr скрывается derived. Это можно обойти?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    _DEN_
    Так ведь и в процессе выполнения нельзя определить derived, объект будет base:
    Код (Text):
    1. #include <iostream>
    2.  
    3. using std::cout;
    4. using std::endl;
    5.  
    6. struct base
    7. {
    8.     /*virtual*/ void f() { cout << __FUNCTION__ << endl; }
    9. //  virtual ~base(){}
    10. };
    11.  
    12. struct derived: public base
    13. {
    14.     void f() { cout << __FUNCTION__ << endl; }
    15. //  virtual ~derived(){}
    16. };
    17.  
    18. int main()
    19. {
    20.     base* ptr = new derived;
    21.     std::cout << typeid(*ptr).name() << endl;
    22.     ptr->f();
    23.     return 0;
    24. }
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    IceStudent

    Кхм... Ты пример-то запускал? ;) Если есть vtbl то по референсу typeid определяет кто скрывается за базовым типом.
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _DEN_
    Вряд ли... в VC++ доступ к RTTI полиморфного класса реализован через vftable, а для неполиморфного жёстко кодируется при компиляции. Не поможет даже реализация своей версии RTTI-ф-ций CRT.
    А зачем обходить-то?
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    green

    Ну как зачем? На тот случай если классы не содержат vtbl. Как вообще должно быть по стандарту?
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _DEN_
    Ну так делай все классы, для которых нужна "динамическая" RTTI, полиморфными, порождая их от специально заведённого базового.
    С динамической RTTI неизбежно связаны накладные расходы на каждый экземпляр класса, поэтому должна быть возможность добавлять её только для определённых классов.
    Можно было, конечно, ввести в язык специальный квалификатор, особого выигрыша это не даст, поскольку при наличии vftable добавочные RTTI-расходы на объект равны нулю.
    ---
    хз :derisive:
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    green

    Умнег, блин))) А если это не мои классы?

    Хм... Да, я тут подумал - на этапе компиляции не узнать, каким классам понадобится динамический RTTI. Придется полюбэ это как-то явно указывать. Видимо Саттер и Компания решили, что наиболее подходящее указание - это наличие виртуальных функций.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Случайно продублировал. Удалите пожалуйста.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    _DEN_
    Запускал. Вывело, как и должно было быть: "struct base\nbase::f\n". У меня ж virtual закомментировано. Иначе определяет правильно.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    IceStudent

    Значит я тебя не правильно понял. Но это значит что и ты не понял вопроса)) О статическом TI речь и не шла. Понятное дело что речь идет о рантайме.
     
  11. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _DEN_
    Ты имеешь в виду чужие классы в бинарном(скомпилированном) виде ? Тогда вообще труба, по-моему - там даже "статической" RTTI может не быть.
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    green

    Нет, я имею ввиду просто чужие классы. Например STL или boost.
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    _DEN_
    Имхо, в рантайме такое никак не сделать.