Полиморфизм. проблемма с thiscall функциями.

Тема в разделе "LANGS.C", создана пользователем Quark, 7 ноя 2007.

  1. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    компилятор VC6 на следующий код
    Код (Text):
    1. class Base
    2. {
    3. protected:  int a;
    4. public: virtual void SetA(int i);
    5. };
    6.  
    7. class Child1:public Base
    8. {
    9. public: void SetA(int i) { a = i+1;}
    10. };
    11.  
    12. class Child2:public Base
    13. {
    14. public: void SetA(int i) { a = i+2;}
    15. };
    16.  
    17. void Main()
    18. {
    19.     Base *pBase[2];
    20.  
    21.     pBase[0] = new Child1;
    22.     pBase[1] = new Child2; 
    23. }
    при линковке выдаёт ошибку:
    unresolved external symbol "public: virtual void __thiscall Base::SetA(int)" (?SetA@Base@@UAEXH@Z)

    Сдаётся мне, что проблемма с настройками линкера... в чем может быть дело?
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    не реализована Base::SetA
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Все верно, т.к. нет реализации метода SetA в базовом классе. Его нужно либо реализовать, либо сделать чистым виртуальным: 'public: virtual void SetA(int i) = 0;'. И кстати, Main надо с маленькой буквы -- main.

    rmn опередил :).
     
  4. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Main - у меня переопределена точка входа. пасиб за совет.
     
  5. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    прототипы виртуальной ф-ции и её переопределенных ф-ций в унаследованных классах должны совпадать, так?
    подзапамятовал я.
     
  6. IceStudent

    IceStudent Active Member

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

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Не совсем. Типы возвращаемых значений перекрываемых функций могут быть ковариантны. Т.е. все-таки один-в-один совпадать не обязаны.
     
  8. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Чёт опять не получается. сейчас выдаёт:

    main.obj : error LNK2001: unresolved external symbol __purecall
     
  9. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    __purecall - 4e это такое?
     
  10. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Х.з. Я в студию поставил компилятор и линкер от DDK. Может из-за этого. Но тем не менее должно компилироваться.
     
  11. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    __purecall() это заглушка для абстрактных методов (pure virtual).
     
  12. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Quark
    Код (Text):
    1. class Base {
    2.   protected:int a;
    3.   public:virtual void SetA(int i) = 0;
    4. };
    5.  
    6. class Child1 : public Base {
    7.   public:void SetA(int i) { a = i+1; }
    8. };
    9.  
    10. class Child2 : public Base {
    11.   public:void SetA(int i) { a = i+2; }
    12. };
    13.  
    14. int main() {
    15.   Base *pBase[2];
    16.  
    17.   pBase[0] = new Child1;
    18.   pBase[1] = new Child2;
    19.  
    20.   return 0;
    21. }
     
  13. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Мне не нужен стартап, генерируемый студией. Вобщем разведка доложила, что нужен msvcrt.lib. С ним всё в порядке. Самое интересное - он нужен только для линковке. В импорте msvcrt.dll нету :)))
     
  14. Andrik

    Andrik New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    19
    Не работает только с Main или с обычным стартом и main тоже?
     
  15. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    Посмотри в исходниках crt - они, вроде как, идут в комплекте со студией. Если исходников нет, попробуй создать просто заглушку - пустую функцию. Насколько я понимаю, она таковой и является по умолчанию. А вообще - гугл рулит.
     
  16. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    Полностью дан ответ на вопрос