Неразрешенный внешний символ на виртуальной функции - PullRequest
0 голосов
/ 15 июня 2010

Каждый из этих классов находится в отдельных модулях dll:

class Base
{
public:
  virtual void foo();
  void bar();
};


class Derived : public Base
{
public:
  // override Base::foo()
  void foo();
};

In Other.cpp:

#include "Derived.h"

Модуль, содержащий производные ссылки с Base.lib (не показаны директивы экспорта / импорта). Модуль, который содержит Other.cpp ссылки с Derived.lib, но не Base.lib. До этого момента все работало нормально.

Однако, если я изменю Base :: bar () на виртуальный и не внесу изменения в Derived, компоновщик будет жаловаться при компоновке Other.dll:

Other.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Base::bar()" ...

Единственное решение, которое я нашел, это переопределить Base :: bar () в Derived или сделать так, чтобы Other.dll также связывался с Base.lib. Оба решения нежелательны, поскольку они добавляют требования клиента при изменении сервера.

Есть какие-нибудь идеи по поводу лучшего способа доступа / определения виртуальных методов базового класса в этом сценарии?

1 Ответ

2 голосов
/ 15 июня 2010

Что происходит, так это то, что virtual Base::bar должен быть в таблице производных, поскольку Derived::bar нет.

Я не понимаю ваш комментарий о "требованиях клиента при смене сервера".Я не вижу, как база / производные карты на клиент / сервер.Для меня это два независимых измерения.

...