首页 > 解决方案 > 基类不可访问错误,为什么私有继承会这样做?

问题描述

class a
{
public:
    int var;
};

class b : a
{
};

int main()
{
    a* p = new b();

    return 0;
}

我知道它是由私人继承引起的,但我想知道为什么会这样?

标签: c++classinheritanceprivate-members

解决方案


这正是私有继承中“私有”的含义。b继承自的事实a是一个实现细节,从外部看不到。

我没有尝试访问类外部的任何私有成员,或任何受保护的外部类层次结构,我只是尝试使用基类指针创建一个动态对象,它会引发错误

您正在尝试访问从 ab*到 a的转换,a*但您不能,因为从外部无法访问基类。私有继承更接近于组合而不是公共继承。您的示例可以重写为

class b {
      a a_instance;
};

的实现b会略有不同(因为对a成员函数的调用是通过a_instance而不是this),但效果是一样的:我们组成b并且a用户对此一无所知(aka private)。


推荐阅读