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

标签 c++ class

我有一个关于类(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 (); 

“private vector< Card* >”到底是什么意思?这是否意味着我继承了 vector 类的所有公共(public)成员?我也可以访问 vector 私有(private)成员吗?如果它是 protected 或公共(public)的而不是私有(private)的,这会有什么不同?澄清将不胜感激

最佳答案

私有(private)继承使您可以访问基类的公共(public)和 protected 方法,就像公共(public)继承一样。不同之处在于这些方法对您的类是私有(private)的。对于 protected 继承也是如此。你得到了基类的 public 和 protected 方法,它们在你的类中都是 protected 。

私有(private)继承允许您根据另一个类来实现一个类,这与拥有该类的私有(private)数据成员没有什么不同。从这个意义上讲,一个从另一个私有(private)或“ protected ”继承的类与其具有“has-a”关系,而不是公共(public)继承的“is-a”关系。这意味着例如 Liskov substitution principle不适用。

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

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.
}

关于非公共(public)继承中的 C++ 基类方法访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13588438/

相关文章:

c++ - 如何使用 clang++ 在 LLVM 中编译 C++ 程序?

c++ - 链接 C++ 失败 [未定义的引用 boost::filesystem3 ...]

c++ - 具有 PPL 和并行内存分配的线程 ID

javascript - typescript 方法覆盖不起作用

java - 公共(public)领域的替代品有哪些?

c++ - Qt - QWidget : Cannot create a QWidget when no GUI is being used

c++ - 为什么 ferror() 在设备上没有剩余空间时返回 EPERM - 我希望 ENOSPC

python - 最Pythonic的方式来处理(1)对象类型的一般属性和(2)该对象实例的单独属性

python - 如何在python中使用循环创建多个类对象?

javascript - Event.observe 函数 - 按类而不是 id 观察元素