需要一些帮助理解私有/受保护/公共继承

时间:2017-06-07 13:09:25

标签: c++ class oop inheritance

目前,我正在学习OOP,并且我尝试了许多继承示例。我刚刚测试了这段代码:

struct Basic : public Material
{
  Basic() = default;

  virtual std::unique_ptr<Material> clone() const override
  {
      return std::make_unique<Basic>( *this ); 
  }

  virtual int get_color() const override
  {
    return 1;
  }
};

为什么这样做?为什么我可以使用#include <iostream> using namespace std; class B { int a; protected: B(int i=0) { a=i; } int get_b() { return a; } }; class D: private B { public: D(int x=0): B(x) {} int get_a() { return get_b(); } }; int main() { D d(-89); cout << d.get_a(); return 0; } 函数?为什么构造函数get_b()有效?如果我将B(x)更改为protected,那么为什么它不起作用?

稍后编辑:在构造函数和函数private上使用protected关键字意味着如果继承是公共的,派生类可以访问它们。但是,在这种情况下,通过使用私有继承,我希望构造函数和get_b()函数在类get_b()中是不可用的。

3 个答案:

答案 0 :(得分:1)

  

为什么我可以使用get_b()函数?

因为get_b()protected并且可以由派生类使用。

  

为什么构造函数B(x)有效?

同样的原因,它是protected,在这种情况下可以通过派生类D访问。

  

如果我将protected更改为private,为什么它不起作用?

由于private成员只能由类本身访问(在本例中为B)并且是朋友,D无法访问private B成员}。

  

稍后编辑:通过在构造函数和函数上使用protected关键字get_b()意味着派生类可以访问如果继承是公共的

声明中的粗体部分不正确。继承说明符说明如何在类B的子级和用户中访问D成员,它不会将类D的方法的访问权更改为类B的成员。< / p>

  

但是,在这种情况下,通过使用私有继承,我希望类D中的构造函数和get_b()函数不可用。

你的期望是错误的。私有继承会使类B中的成员无法访问类D的子级和用户,它不会影响B成员对D本身方法的可访问性。

答案 1 :(得分:0)

实际上,公共,受保护和私有继承指定将应用于继承成员的最自由的访问控制。我的意思是:

公共

class Pub : public B

B继承的Pub的公开成员将在Pub本身和外部(以及从Pub派生的任何类中)访问。受B继承的Pub受保护成员可在Pub内以及Pub派生的类中访问。 B中的私人成员将无法在Pub内访问。

另一种表达方式:B的公众成员仍然是公开的,受保护的成员仍然受到保护,私人成员无法访问。

受保护的

class Prot : protected B

B继承的Prot的公共成员和受保护成员将像Prot的受保护成员一样可以访问:在类本身内以及从它派生的类中,但不能从外部访问。 B仍然无法访问Prot的私人成员。

另一种表达方式:B的公众成员受到保护,受保护的成员仍然受到保护,私人成员无法访问。

私人

class Priv : private B

B继承的Priv的公共成员和受保护成员只能访问Priv,而不能访问任何派生类(它们可以像{{1}的私有成员一样访问})。 Priv仍然无法访问B的私人成员。

另一种表达方式:Prot的公共成员和受保护成员成为私人成员,私人成员无法访问。

答案 2 :(得分:-2)

私有/受保护/公共继承就是决定谁知道继承。在公共继承中,所有外部代码都知道它。在受保护的继承中,只有孩子知道。在私有中,只有继承类才知道。最重要的是,相同的关键字适用于成员,但不受继承可见性的影响。如果类知道继承,则成员像往常一样可见。如果它不知道继承,它甚至不太了解成员,无论是公共的,私人的还是受保护的。

要回答您的具体问题,如果您创建的课程E继承(公开)您的课程D,您将无法拨打get_b,但您仍然可以致电get_a < / p>