当将访问修饰符设置为私有或受保护时,为什么不能创建基类的指针并将其指向子类?

#include<iostream>
using namespace std;

class father
{
     public:
     int n=10;
};

class son:protected father
{
public:
    son(){
        cout<<n;
    }
};

int main()
{
    father *f;
    f=new son;
}

最佳答案

班级本身及其子级可以访问班级的受保护成员。类似的逻辑适用于受保护的继承。也就是说,当您拥有受保护的继承时,只有类及其子级才“知道”这种继承。因此,使用您的代码(使用受保护的继承),您可以轻松地在son类中将son转换为父亲,如下所示。

class father
{
public:
  int n = 10;
};
class son : protected father
{
void tmp(){father *f = new son;}
public:
  son()
  {
    cout << n;
  }
};


但是,要实现您希望实现的目标,您必须使用公共继承(以使其他人可以“意识到”这种继承的存在)。

#include <iostream>
using namespace std;
class father
{
public:
  int n = 10;
};
class son : public father
{
public:
  son()
  {
    cout << n;
  }
};
int main()
{
  father *f;
  f = new son;
}

关于c++ - 错误:“父亲”是“儿子”不可访问的基础,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57400453/

10-13 09:09