私有继承的派生类的对象不能访问基类成员函数

Object of derived class inherited privately cannot access base class member function

本文关键字:基类 访问 成员 函数 不能 继承 派生 对象      更新时间:2023-10-16
#include <iostream>
using namespace std;
class B
{
  public:
  int x;
  void print()
  {
    cout<<x;
  }
};
class D:private B
{
};
int main()
{
  D d;
  d.print();
}

为什么我不能访问打印方法?来自B的Print方法将是D的私有属性,所以我应该使用D的对象访问它是合乎逻辑的。我得到的错误是:

'B'不是'D'的可达基。

私有继承意味着基类只能在派生类的成员函数中访问。通常,当您想要为has-a关系建模时,您可以使用私有继承,而不是is-it。这里的情况并非如此,您试图直接在main()中调用它。

#include <iostream>
class B
{
public:
    int x{42};
    void print()
    {
        std::cout << x;
    }
};
class D: private B
{
public:
    void f()
    {
        print(); // can access the private one in B
    }
};
int main()
{
    D d;
    d.f();
}

Live on Coliru

您可以在这里阅读更多信息:私有、公共和受保护继承的区别

或者,正如@WhozCraig提到的,您可以通过派生类的public部分中的using语句更改访问:

using B::print; // now it is visible in the derived class