2011-01-07 3 views
1

В настоящее время у нас есть свод кода, который позволяет плагины услуг, которые предлагают формы связи с ядром, например, tcp/ip, udp/ip, usb и т. Д. Эти службы плагины обращают внимание на экземпляры класса уведомлений на ядро ​​для дальнейшей обработки.C++ Виртуальное ключевое слово как способ избежать включения единиц кода

В текущей реализации сервисный проект (который представляет собой отдельную динамически связанную библиотеку, запущенную в режиме реального времени через dlopen и друзей) будет скомпилирован против файла notifier.cpp, который находится в основном исходном коде (отдельный проект). Это дает доступ к реализациям методов уведомлений. Это не вызывает никаких претензий.

Два альтернативных варианта: 1. Поместите реализации метода уведомления в файл заголовка. 2. объявить методы уведомления инициатором и привязкой привязки до выполнения.

Избежать вопросов вычислительных издержек, каковы последствия варианта 2?

Есть ли другие возможности, доступные нам?

Благодаря

+2

Почему вы хотите объявить их 'virtual', если вы не собираетесь переопределять их в производных классах? –

+0

Кстати, другой вариант заключается в том, чтобы реализация метода была скомпилирована в ядро, а не в службу. –

+0

Мысль о том, что внутренняя обработка метода изменяется, скажем, исправление ошибки, мы не хотим перекомпилировать каждый плагин, чтобы воспользоваться этим исправлением. Если бы у нас была привязка времени выполнения, для запуска была бы запущена версия в ядре, то есть с исправлением .... нет? – Corvusoft

ответ

2

Да, обнажая интерфейс с чисто виртуальными функциями для потребителей является стандартным способом воздействия C++ объектов из DLL Windows. Клиенту не известны никакие детали реализации: нет переменных-членов, нет элементов-членов, только виртуальный макет.

(Добавить подсчет ссылок и языка-агностик версию dynamic_cast, которую мы будем называть QueryInterface а, и у вас есть COM, которая распространена на Windows)

Эта техника будет хорошо работать на * NIX общие библиотеки также.

+0

Спасибо за ваш ответ Бен. Так что совершенно правильно поставить ключевое слово virtual, чтобы обойти ошибки, такие как следующие Undefined символы: Notifier :: get_name(), на которые ссылаются: SQLiteDataSource :: select_notifier (string const &, string const &, string const &) в SQLiteDataSource.o Это остановит эта ошибка в плагине SQLiteDataSource и привязка задержки до времени выполнения. – Corvusoft

+0

@ user394663: Предоставление клиенту сведений о базовом классе с чистыми виртуальными функциями, а затем их реализация в производном классе - очень хороший способ развязки (не позволяя клиенту пытаться напрямую использовать реализацию). Просто окропить код с помощью 'virtual' нет. Вы должны ввести наследование, чтобы правильно отделить интерфейс от реализации. –

Смежные вопросы