Кроме того, у вас может возникнуть проблема с использованием boost :: scoped_ptr для pImpl, потому что ваш pImpl объявлен заранее, и вы можете обнаружить, что класс должен быть полностью видимым, чтобы вызвать деструктор scoped_ptr (который удаляет базовый элемент) .
Некоторые компиляторы позволят вам обойти эту проблему, поместив тело вашего деструктора в модуль компиляции (файл .cpp), где виден класс.
Самое простое решение состоит в том, что если ваш деструктор должен быть реализован так или иначе, вы можете просто использовать необработанный указатель и удалить его деструктором. И если вы хотите использовать что-то из boost, чтобы помочь вам, выведите свой внешний класс из boost :: noncopyable. В противном случае убедитесь, что вы правильно обрабатываете конструкцию и назначение копирования.
Вы можете использовать shared_ptr для вашего pImpl. Затем вы можете счастливо скопировать свой внешний класс, хотя они совместно используют один и тот же базовый класс, если вы не перегружаете конструктор копирования и оператор присваивания, чтобы сделать иначе.