C ++中的同时私有和公共继承

假设一个类
Y
公开继承了一个类
X
。公开继承
X
,是否有可能让一个班级
Z
私下继承
Y
? 为了更清楚,假设
X
定义了公共方法
x1
x2
Y
继承
X
,覆盖
x1
并提供方法
y
。 C ++是否允许将第二类
Z
子类化为
Y
,使得ѭѭѭ的implementation6ѭ和
y
的实现是私有的,而外界只看到它公开继承
X
,即只有一种公共方法
x2
?     
已邀请:
是的,这称为虚拟继承。
struct X {
  virtual void x1();
  void x2();
};

struct Y : virtual X {
  void x1(); // overrides
  void y();
};

struct Z : private Y, virtual X { 

};
人们不能做
z.y()
z.x1()
但他们可以做
z.x2()
并且可以将
Z*
转换为
X*
。但是,一旦他们这样做,他们当然可以拨打
converted->x1()
converted->x2()
。 你还没有说过你的目标,但听起来你真的想把
Y
作为指针
struct X {
  virtual void x1();
  void x2();
};

struct Y : X {
  virtual void x1(); // overrides
  void y();
};

struct Z : X { 
  virtual void x1() { // overrides
    /* uses y->x1 */ 
  }
  Y *y;
};
这看起来对我来说比较熟悉。     
当然。你可以在
public:
部分使用
using X::x2
。当然,如果Y覆盖x2,那么你将忽略这个覆盖。     
首先,我不太清楚我理解你的最后一句话。   C ++是否允许使用第三类Z.   子类Y以Y的方式   x1和y的实现是   私人可用,而   外界只看到它继承   公开X,即只有一个   公共方法x2? 如果
Z
X
公开继承,则
x1
和ѭ7都可用:虽然
x2
的可访问性可能在
Z
中改变,但没有什么能阻止外界通过
X
指针操纵
Z
并调用
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
实现。     
我认为using语句更好地填充了这个角色,它允许你在Z上指定哪些私有方法可用:
class X
{
    public:
        virtual void x1() {}
        virtual void x2() {}

};

class Y: public X
{
public:
    virtual void x1() {}
};

class Z: private Y
{
public:
    using X::x2;

};
    
如果在至少一个位置使用X的非虚拟继承,则会获得具有不同访问路径和访问权限的两个不同的X子对象。 如果在两个位置使用X的虚拟继承,则应该在两个位置都使用公共继承,因为无法通过虚拟继承进行访问。如果您将一个派生非公开,您仍然可以使用其他路径获取访问权限。如果这两个派生都不是公共的,那么你只能派生出另一个类,因此,非公共虚拟继承不能由类型系统强制执行,因此它是无意义的,并且永远不应该在该语言中被允许。     

要回复问题请先登录注册