クラスがあります。それを Product と呼びましょう。その実装は、ユーザーから完全に隠したいと思います。とはいえ、ユーザーには何が入っているか分からないまま、商品を集めて回し、どうするかを決めるのが一般的です。
最初に頭に浮かんだアイデアは、単純に ProductFactory クラスを作成し、ProductFactory.h ヘッダーで Product クラスを前方宣言するというものでした。
Product クラスのオブジェクトは、Product クラスへの共有ポインタを返す makeProduct メソッドによって作成されます。ユーザーは中身を見ることはできませんが、たとえば Service クラスに送信することができます。このクラスの実装には、Product の完全な定義が含まれているため、内部にアクセスできます。
それは良い考えだと思いますか、それともむしろ回避策のように感じますか?
また、ユーザーがアクセスできるトップレベルの機能が必要な場合に備えて、pimpl イディオムを使用することも考えていました。
抽象基本クラスはオプションではないことに注意してください。たとえば、ユーザーにとって十分に制限され、Service クラスにとって十分なインターフェイスは実際には存在しないためです。