Когда у меня есть абстрактный базовый класс foo
, определенный в libX.a
class foo {
virtual void bar() = 0;
};
... и производный класс foo_impl
, определенный в libY.a
class foo_impl : public foo {
void bar() { /* do something */ }
};
... и использовать обе библиотеки для компоновки программы -lX -lY
int main() {
foo* my_foo = receive_a_foo_from_somewhere();
my_foo->bar();
}
потом
- как я могу заставить компоновщика фактически связать символ, относящийся к
foo_impl::bar()
? objdump -t program
перечисляетfoo_impl::bar()
, когда он правильно связан?
РЕДАКТИРОВАТЬ: чтобы уточнить, я использую Linux с gcc или clang
РЕДАКТИРОВАТЬ 2: пропустил virtual
для bar()
РЕДАКТИРОВАТЬ 4: Я извиняюсь за отсутствие ясности. Вопрос должен был звучать так: «Как я могу заставить компоновщик включить foo_impl::bar()
в исполняемый файл, чтобы его можно было разрешить во время выполнения?»
foo_impl
, функция-членfoo_impl
помечается как использованная при создании экземпляра объекта этого типа. Затем компоновщик автоматически включит его в ваше приложение. - person Captain Obvlious   schedule 28.05.2013foo*
я получаю) мне нужно где-то создать фиктивныйfoo_impl
, чтобы убедить компилятор включить его функциональность? - person idefixs   schedule 28.05.2013foo_impl
является единственной реализациейfoo
, и вы хотите, чтобы все вызовыfoo::bar()
автоматически переводились вfoo_impl::bar()
? Тогда вам нужен static_cast. Но в таком случае я предлагаю вам сделатьfoo_impl
родителемfoo
. Если это не так, то принудительное связывание компоновщиком символа, ссылающегося наfoo_impl::bar()
, вызовет ошибку, когдаfoo
на самом деле неfoo_impl
. - person Jiaming Lu   schedule 28.05.2013foo_impl
не является одной реализациейfoo
- person idefixs   schedule 28.05.2013my_foo
указывает наfoo_impl
и может безопасно вызыватьfoo_impl::bar()
? - person Jiaming Lu   schedule 28.05.2013foo
должен реализоватьbar()
- person idefixs   schedule 28.05.2013bar()
, но они могут реализовывать по-разному, не обязательно бытьfoo_impl::bar()
, но также могут бытьanother_foo_impl::bar()
. - person Jiaming Lu   schedule 28.05.2013-lX -lY -lX
ошибки ссылок? - person aschepler   schedule 01.06.2013foo_impl
? - person aschepler   schedule 01.06.2013foo*
происходит из файла, содержащего абстрактный сериализованныйfoo
, тогда, очевидно, должен быть какой-то код десериализации для (среди прочего)foo_impl
. Но покаfoo_impl
не используется явно, код десериализации может быть не связан... - person idefixs   schedule 02.06.2013foo::bar()
объявлен закрытым! - person curiousguy   schedule 15.07.2013