Можно ли скрыть части иерархии наследования в С++?

Рассмотрим следующее:

Класс B наследуется публично из класса A. Оба они представлены в библиотеке, и я не могу их изменить.

Я хочу реализовать класс Foo, который происходит от B, но я хочу разрешить пользователям Foo использовать только публичные функции A и Foo (не от B). Для них не имеет значения, что Foo наследует от B, это в принципе деталь реализации, которую я не могу избежать.

Итак, в принципе я хочу, чтобы Foo публично наследовался от A, но конфиденциально от B.

Есть ли какая-нибудь конструкция в С++, которая позволила бы мне это сделать?

Я должен добавить, что виртуальное наследование не является опцией, поскольку A, в моем случае, происходит от QObject (см. Можно ли использовать * виртуальное * множественное наследование, если QObject происходит от DIRECTLY?).

(NB: Для заинтересованных лиц: в моем случае A есть QWindow и B is Qt3DExtras::Qt3DWindow)

Ответ 1

Самое близкое, что вы можете сделать в С++, это:

class Foo : private B {
  public:
    using A::foo; // Expose function foo in Foo API.
    using A::bar;
    operator A&() { return *this; } // Implicit conversion to `A` when needed.
    operator A const&() const { return *this; }
};

Ответ 2

Так как это Qt, я думаю, что это самое близкое, что вы можете сделать:

struct Foo : A {
    // override all function of A, forward its to B
private:
    B b; // or pointer to B, it depend on your design
};