Дано: Два класса, один — абстрактный, все методы виртуальные. Другой от него отнаследован, все методы реализованы и добавлено несколько штук новых.
При сборке получаю ошибки вида:
MyProj error LNK2001: unresolved external symbol "public: virtual bool __thiscall AbstractClass::someMethod(void)"
для каждого из методов базового абстрактного класса. Т.е. линкер ругается на отсутствие реализаций виртуальных методов.
Вопросы к общественности:
1) Что именно линкер имел в виду?

2) Как с этим бороться?
Заранее спасибо
BQS>Вопросы к общественности:
BQS>1) Что именно линкер имел в виду?
BQS>2) Как с этим бороться?
Не мешает взглянуть на минимальный код воспроизводящий данную ошибку.
BQS>2) Как с этим бороться?
Может, нужно дописать
... = 0;
в объявлениях виртуальных методов?
Здравствуйте, 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>>
Здравствуйте, Gleb Alexeev, Вы писали:
GA>Чисто виртуальные? =0 случайно не забыл в объявлении?
Хм. Точно.
Спасибо
Здравствуйте, 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() {} // можно и нужно определять, если хотим вызывать статически