Прежде всего, я не совсем уверен, что понимаю ваше последнее предложение.
Позволяет ли C ++ для третьего класса Z подкласс Y таким образом, что реализация Y для x1 и y является конфиденциальнойдоступны для него, в то время как внешний мир видит, что он публично наследует X, т. е. имеет только один публичный метод x2?
Если Z
публично наследует от X
, то оба x1
иx2
будет доступно: хотя доступность x2
может быть изменена в Z
, ничто не мешает внешнему миру 1016 * манипулировать Z
с помощью указателя X
и позвоните x2
.
При этом, вы также можете иметь Z
наследовать в частном порядке от Y
и публично от X
, хотя, как указал Йоханнес, вы должны изучить виртуальное наследование.так как Z
будет, таким образом, наследовать дважды от X
.
В зависимости от ваших потребностей, вы также можете захотеть взглянуть на шаблон декоратора (может быть, это полностьюне связанные, но по какой-то причине, читая ваш вопрос, я чувствую, что это то, чего вы хотите достичь):
class X
{
public:
virtual void x1();
virtual void x2();
};
class Y : public X
{
public:
virtual void y();
virtual void x1();
};
class Z : public X
{
public:
explicit Z(X *x) : x_(x) {}
virtual void x1() { x_->x1(); }
virtual void x2() { x_->x2(); }
private:
X *x_;
};
int main()
{
Y y;
Z z(&y);
}
В этом быстром и грязном примере кода Z
- это X
(публичное наследование), но повторно использует Y
реализацию.