По сути первый способ это та же техника, которая используется внутри Qt.
... она называется PIMPL (Pointer to IMPLementation)
Похоже, но тут структура сложнее. Если брать конкретно QWidget, то у него есть QWidgetPrivate класс. При этом в файлах реализации: qwidget_win.cpp, qwidget_x11.cpp переопределение идет методов как QWidget, так и QWidgetPrivate.
То есть тут двойной pimpl, при этом и файл QWidget и QWidgetPrivate не являются абстрактными интерфейсами, в них тоже до кучи своих методов, которые уже не зависят от нативных реализаций. А так они бы могли QWidgetPrivate вообще убрать за ненадобностью и в файле qwidget_win.cpp просто сделать реализацию методов QWidget класса. Ну или все методы которые они переопределили для QWidget переместить в QWidgetPrivate, который полностью перенести в тот же qwidget_win.cpp. Только в этом случае им бы пришлось делать кучу лишней работы, так внутреннюю реализацию пришлось бы исправлять для всех ОС одновременно. В общем приват классы что-то типа машинного цеха с общим двигателем для любой платформы. Если основная цель pimpl предоставить одинаковую работу под разными платформами или условиями, то приватные классы такой цели себе не ставят, разве что на уровне отдельно взятых методов, а не всего класса целиком.