Скорее всего, даже если вы пойдете с # 2 и внедрите обертку базового класса, вам все равно придется изменить код клиента (различные методы построения на фабрике, например, для полиморфной обертки базы).
Я бы пошел с # 1, но не с обычным указателем, а с чем-то вроде boost :: shared_ptr или boost :: scoped_ptr (в зависимости от того, что вам нужно).
Второй вариант может позволить вам воспользоваться некоторыми возможностями базового интерфейса-обертки, но я бы рекомендовал против этого: отдавать предпочтение общепринятым подходам, когда это возможно. Если оболочка базового класса предоставляет дополнительные возможности, которые не предоставляет boost :: shared_ptr, например, это будет сторонняя сущность, которая вводит новые концепции в систему и, вероятно, с небольшими или нулевыми преимуществами для нее.
В лучшем случае ваша оболочка базового класса дублирует интерфейс чего-то общего и знакомого большинству разработчиков, таких как boost :: shared_ptr, и в этом случае он заново изобретает колесо, и вы могли бы также использовать boost :: shared_ptr. В худшем случае ваш класс-оболочка представляет совершенно другой интерфейс и, следовательно, вводит в систему внешний код, который другие не сразу распознают.
Независимо от того, насколько вы хороши, другим разработчикам будет гораздо легче доверять и работать с проверенной, хорошо документированной и тщательно протестированной библиотекой, такой как boost, чем решение, разработанное вручную одним инженером. Если только по этой причине, постарайтесь максимально использовать существующие библиотечные решения и предпочитайте их, скажем, пользовательской оболочке базового класса.