Правильный способ сделать (2).
В общем, вам, вероятно, следует подумать о том, чтобы все переменные-члены по умолчанию были защищены вместо приватных.
Причина, по которой большинство программистов выбирают частные, заключается в том, что они не думают о других, которые хотят получить уроки из своего класса, и большинство вводных руководств по С ++ учат этому стилю в том смысле, что все примеры используют частные.
EDIT
Дублирование кода и выделение памяти являются нежелательными побочными эффектами использования шаблона проектирования сутенера, и, насколько мне известно, этого нельзя избежать.
Если вам нужно, чтобы Bimpl наследовал Aimpl и вы хотите предоставить им согласованный интерфейс через A и B, B также должен был бы наследовать A.
Одна вещь, которую вы можете сделать, чтобы упростить вещи в этом сценарии, это заставить B наследовать от A и изменять только конструктор таким образом, чтобы B :: B (...) {} создавал Bimpl, и добавлять диспетчеризацию для всех методов Bimpl, которых нет в Aimpl.