0

我有一个关于课程的问题

// 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 (); 

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

4

2 回答 2

9

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

私有继承允许您根据另一个类来实现一个类,并且与拥有该类的私有数据成员没有什么不同。从这个意义上说,从另一个类私有或“受保护”继承的类与其具有“has-a”关系,而不是公共继承的“is-a”关系。这意味着例如Liskov 替换原则不适用。

现在,在您的特定示例中,从标准库容器继承被认为是不良形式,但请注意,大多数参数都适用于公共继承。

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.
}
于 2012-11-27T16:18:44.093 回答
0

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

也就是说,CardPile继承自vector<Card*>的方式与继承的方式相同public。不同之处在于作用域或类型可以知道这个继承 exceptCardPile及其朋友。

于 2012-11-27T16:22:55.250 回答