C не имеет каких-либо методов (только функции), так что ваш вопрос не имеет смысла в С.
В C++11, предполагая, что метод будет изменен в virtual
, и предполагается, что ваш C++ реализация использует vtable указатель, расположенный при запуске объекта (это часто бывает с GCC в Linux), и если оба старых и новых класса имеют одинаковый размер и используют одно наследование из общего базового класса (например, FooBase
), вы можете использовать оператор размещения new
, поэтому в вашей основной программе:
class FooBase {
virtual ~FooBase();
virtual int bar(int);
/// etc
}
class ProgramFoo : public FooBase {
virtual ~ProgramFoo();
virtual int bar (int);
/// other fields and methods
};
и в плагине:
class PluginFoo : public FooBase {
virtual ~ProgramFoo();
virtual int bar (int);
/// other fields and methods
static_assert(sizeof(PluginFoo) == sizeof(ProgramFoo),
"invalid PluginFoo size");
};
, то вы можете иметь некоторые плагин функции, как
extern "C" FooBase*mutate_foo(ProgramFoo*basep)
{
basep->~ProgramFoo(); // destroy in place, but don't release memory
return new(basep) PluginFoo(); // reconstruct in same place
}
это, мы надеемся, будет превалировать старый vptr по новой.
но это пахнет плохо, вероятно, undefined behavior в соответствии со стандартом C++ 11, но может работать на некоторые C++ реализаций, и, конечно, зависит от конкретной реализации. Я не рекомендую кодирование таким образом, даже если иногда это может случиться «работать».
Идиоматическим способом было бы использовать указатели на функции-члены или C++ 11 closures.
Похоже, что ваша архитектура плагина неправильно спроектирована. Посмотрите на Qt plugins для хорошего вдохновения.
C и C++ - разные языки. –
Возможно, и это специфичная платформа. Он используется, например, в ядре Linux (ksplice).Это больше похоже на исполняемый формат, чем на язык. PS: Чего вы хотите достичь? – ibre5041
@ ibre5041: Ядро Linux не использует C++, что значительно упрощает работу. Например, нет (оператор) перегрузки. – MSalters