Можно ли скрыть части иерархии наследования в С++?
Рассмотрим следующее:
Класс 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
};