Предположим, у нас есть абстрактный базовый класс, который наследуется:Есть ли способ определить, переопределена ли функция?
class Base
{
protected:
Base() {}
virtual ~Base() {}
virtual void on_event_foo(int) {}
virtual void on_event_bar(int) {}
};
struct Concrete : public Base
{
virtual void on_event_foo(int value) {/*do some stuff with @value*/}
};
ли способ узнать (во время компиляции будет лучшим) в virtual
функции из Base
, что было преодолено (с некоторым кодом в конструкторе, или со специальным рисунком)?
Моя цель - реализовать оболочку для библиотеки, использующей некоторые обратные вызовы; и если я могу проверить функции overriden, я создам только обратные вызовы, которые пользователь хочет.
Я хочу, чтобы пользователь мог выбрать функцию, которую он хочет переопределить. Тогда в моем коде я создам обратные вызовы только для переопределенных функций. Чистые функции virtual
не являются решением, поскольку они не могут позволить создать конкретный класс без переопределения всех них.
В конструкторе Base
, сейчас я подключить много статических функций обратного вызова из Base
в C API. В этих функциях я вызываю соответствующую функцию-член. Например, функция обратного вызова - static Base::EventFoo(/* ... */)
, которая вызывает внутри object->on_event_foo(/* .. */)
. Это связано с тем, что я не могу предоставить функцию-член как обратный вызов библиотеки C. Но создание слишком большого количества обратных вызовов делает мою упаковку медленнее. Итак, я хочу подключить только обратный вызов, который хочет пользователь, т. Е. Знание функций, которые его преодолевают.
Сделать функции в базовом классе чистыми виртуальными: 'virtual void on_event_foo (int) = 0;'. –
вы * можете * быть в состоянии сделать что-то со сравнением указателей между объектами – vu1p3n0x
@ vu1p3n0x как сравнение 'Base :: on_event_bar' и' Concrete :: on_event_bar', вы имеете в виду? – Boiethios