非公共继承中的C ++基类方法访问

时间:2012-11-27 16:16:45

标签: c++ class

我对课程有疑问

// Using private inheritance 
class CardPile : private vector<Card*> { 
    public: 
        CardPile (); 
        virtual ~CardPile ();  
        void add (Card* card); 
        void add (CardPile & otherPile); 
        void remove (Card* card); 
        void shuffle (); 

“私人向量&lt;卡*&gt;”是什么是什么意思?这是否意味着我继承了vector类的所有公共成员?我是否也可以访问矢量私人会员?如果它受到保护或公开而非私密,会如何变化?澄清将不胜感激

2 个答案:

答案 0 :(得分:9)

私有继承使您可以访问基类的公共和受保护方法,就像公共继承一样。不同之处在于这些方法是您的类的私有。同样,对于受保护的继承。您可以获得基类的公共和受保护方法,它们在您的类中都受到保护。

私有继承允许您根据另一个类实现一个类,并且与该类的私有数据成员没有什么不同。从这个意义上说,一个私下或“受保护”地继承自另一个的阶级与它有“有一个”的关系,而不是公共继承的“是-a”关系。这意味着例如Liskov substitution principle不适用。

现在,在您的特定示例中,继承自标准库容器的是considered poor form,但请注意,大多数参数都适用于公共继承。

class Foo
{
  void privateFoo() const {}
 public:
  void foo() const {}
};

class Bar : Foo // class inheritance is private by default
{
 public:
  void bar() const { 
    foo(); // OK, foo() is a private method of Bar.
    privateFoo(); // Error! privateFoo() is private to Foo.
  }
};

int main()
{
  Foo f;
  f.foo(); // OK
  Bar b;
  b.bar(); // OK, calls foo() internally
  b.foo(); // Error! foo() is private in Bar.
}

答案 1 :(得分:0)

继承中的可见性与组合中的规则完全相同。

也就是说,CardPile继承vector<Card*>的方式与public继承的方式相同。 不同之处在于范围或类型可以了解除CardPile及其朋友之外的此继承。