Абстрактный класс - линкер хочет реализацию...
От: BreQwaS Россия  
Дата: 05.09.05 14:40
Оценка:
Дано: Два класса, один — абстрактный, все методы виртуальные. Другой от него отнаследован, все методы реализованы и добавлено несколько штук новых.

При сборке получаю ошибки вида:

MyProj error LNK2001: unresolved external symbol "public: virtual bool __thiscall AbstractClass::someMethod(void)"


для каждого из методов базового абстрактного класса. Т.е. линкер ругается на отсутствие реализаций виртуальных методов.

Вопросы к общественности:

1) Что именно линкер имел в виду?
2) Как с этим бороться?

Заранее спасибо
http://livejournal.com/users/breqwas
Re: Абстрактный класс - линкер хочет реализацию...
От: Анатолий Широков СССР  
Дата: 05.09.05 14:45
Оценка:
BQS>Вопросы к общественности:

BQS>1) Что именно линкер имел в виду?

BQS>2) Как с этим бороться?

Не мешает взглянуть на минимальный код воспроизводящий данную ошибку.
Re: Абстрактный класс - линкер хочет реализацию...
От: Gleb Alexeev  
Дата: 05.09.05 14:46
Оценка: 10 (1)
Здравствуйте, BreQwaS, Вы писали:

BQS>Дано: Два класса, один — абстрактный, все методы виртуальные. Другой от него отнаследован, все методы реализованы и добавлено несколько штук новых.


Чисто виртуальные? =0 случайно не забыл в объявлении?
Re: Абстрактный класс - линкер хочет реализацию...
От: srez Россия  
Дата: 05.09.05 14:47
Оценка: 10 (1)
BQS>2) Как с этим бороться?

Может, нужно дописать
... = 0;
в объявлениях виртуальных методов?
Re: Абстрактный класс - линкер хочет реализацию...
От: srggal Украина  
Дата: 05.09.05 14:47
Оценка:
Здравствуйте, BreQwaS, Вы писали:

BQS>Дано: Два класса, один — абстрактный, все методы виртуальные. Другой от него отнаследован, все методы реализованы и добавлено несколько штук новых.


BQS>При сборке получаю ошибки вида:


BQS>

MyProj error LNK2001: unresolved external symbol "public: virtual bool __thiscall AbstractClass::someMethod(void)"


BQS>для каждого из методов базового абстрактного класса. Т.е. линкер ругается на отсутствие реализаций виртуальных методов.


BQS>Вопросы к общественности:


BQS>1) Что именно линкер имел в виду?

BQS>2) Как с этим бороться?

BQS>Заранее спасибо


Возможно в потомке — вы немного напутали с сигнатурами, например const забыли
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: Абстрактный класс - линкер хочет реализацию...
От: BreQwaS Россия  
Дата: 05.09.05 14:50
Оценка:
Здравствуйте, Gleb Alexeev, Вы писали:

GA>Чисто виртуальные? =0 случайно не забыл в объявлении?


Хм. Точно.
Спасибо
http://livejournal.com/users/breqwas
Re: Абстрактный класс - линкер хочет реализацию...
От: Кодт Россия  
Дата: 05.09.05 14:56
Оценка: 15 (1)
Здравствуйте, BreQwaS, Вы писали:

BQS>1) Что именно линкер имел в виду?


Линкер имел в виду, что где-то (см.ниже) был сделан невиртуальный вызов метода someMethod().

BQS>2) Как с этим бороться?


Не вызывать виртуальные методы из конструктора/деструктора
Вызов напрямую — невиртуальный.
Опосредованно — приведёт к pure virtual function call.
struct A
{
  virtual void foo() = 0;
  void bar() { foo(); }
  void buz() { A::foo(); } // статический вызов

  A()
  {
    foo(); // абсолютно всегда это A::foo(), и никаких наследников
    bar(); // pvfc
    buz();
  }
};

struct B : A
{
  virtual void foo() {} // недоступен из A::A()
};

void A::foo() {} // можно и нужно определять, если хотим вызывать статически
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.