DLL экспортированный класс: абстрактный базовый класс и pimpl? - PullRequest
0 голосов
/ 26 сентября 2018

В последнее время я изучал создание DLL с использованием C ++ и случайно наткнулся на обсуждение «Абстрактные базовые классы против идиомы Pimpl», когда речь заходит о совместимости ABI.Я довольно новичок в работе с DLL, поэтому, пожалуйста, будьте терпеливы, если я неправильно понял термин / концепцию.Вот моя история:

Я читал в этой статье здесь на CodeProject.com , где автор заявляет, что использование абстрактного интерфейса - это путь.

Подводя итог: у вас есть абстрактный базовый класс class IFoo, фабричный метод extern "C" __declspec(dllexport/dllimport) IFoo* createFoo(); и фактическая реализация class FooImpl интерфейса IFoo, который фактически создается и возвращается createFoo().

Пока все хорошо.

Теперь я обнаружил, что некоторые люди утверждают, что только Pimpl-Idiom может сохранить совместимость с ABI ( В чем смысл шаблона PImpl, хотя мы можем использовать интерфейс для той же цели в C ++? , идиома Pimpl vs. Чистый интерфейс виртуального класса ), и я немного растерялся:

Как я понимаю, pimpl: у вас есть class Bar с указателем на class BarImpl, который содержит все детали реализации.

Мои вопросы:

  1. Если я изменю только внутреннюю работу в обоих случаях (измените либо * 1032)* или class BarImpl) АБИ кода "Facing пользователь "в обоих случаях не меняет или делает это?

  2. С другой стороны, оба подхода явно нарушают совместимость ABI, если я внесу изменения в class Foo или class Bar,право ?

  3. В случае, если мои предположения о совместимости ABI с использованием абстрактных базовых классов неверны.Нужно ли использовать смесь абстрактных базовых классов в DLL, чтобы действительно поддерживать ABI-совместимость, если я только выполняю изменения во внутреннем коде библиотек?

Iнадеюсь, я смогу четко сформулировать, что для меня непонятно;)

РЕДАКТИРОВАТЬ: Под "изменением внутренних компонентов" я также имею в виду добавление / удаление членов / методов в классах реализации FooImpl и BarImpl.

...