关于 c++ 继承的困惑

A confusion about c++ inheritance

本文关键字:继承 c++ 关于      更新时间:2023-10-16

使用继承时,我从教程中读到说

相反,如果指定了最严格的访问级别(私有),则所有基类成员都将作为私有继承,因此无法从派生类访问。

所以我测试了以下代码,但派生类仍然可以访问基类的成员。

为什么?

#include <iostream>
using namespace std;
class Polygon {
  protected:
    int width, height;
  public:
    Polygon():width(10),height(10){}
 };
class Rectangle: private Polygon {
  public:
    int area ()
      { return height; }
 };
int main () {
  Rectangle rect;
  cout << rect.area() << 'n';
  return 0;
}

输出为 10

派生类型可以访问基类的publicprotected成员。这与继承的类型无关。但是,如果继承private,则成员都private派生类型中。

class Foo
{
 public:
  int i;
};
class Bar : private Foo
{
 public:
  void hello() { 
   ++i; // OK, I can see Foo's public and protected members 
  }
};
int main()
{
  Bar b;
  b.hello(); // accesses i internally. OK
  b.i;       // Error, i is private in Bar
}

私有继承意味着所有基成员都成为派生类的私有成员。派生类本身仍然可以访问成员,但其他派生类不能。

根据C++标准

如果一个类声明为另一个类的基类,请使用 专用访问说明符,公共和受保护成员 基类可作为派生类 117 的私有成员进行访问。

因此,在您的示例中,基类的受保护数据成员

protected:
    int width, height;
可作为派生类的私有成员访问

,派生类的任何成员函数都可以访问其私有 DARA 成员。