指向基类和私有继承的指针

Ron*_*ean 10 c++

以下简单示例将产生编译器错误,因为我意外地使用私有继承:

main.cpp:21:错误:'A'是'B'无法访问的基础

class A
{


};

class B : /*ups forgot that -> public*/ A
{


};

int main(int , char *[])
{
    A* test = new B;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你能不能帮我解释一下究竟是在基类交通不便,为什么需要从转换B*A*

Jan*_*Jan 11

私有继承意味着对于除B(和B的朋友)之外的所有人,B不是从A派生的.

  • @Ronald McBean:因为`A :: A()`是从(B :: B()`调用(隐式),所有B的成员_can_访问A. (2认同)

Dav*_*eas 7

你能帮我解释一下基类中究竟什么是不可访问的,以及为什么从B*到A*的转换需要它?

的Ouside B和的朋友B,这个简单的事实B A不可见的.这不是隐藏成员变量或成员函数,而是隐藏关系本身.这就是为什么main你不能new B用指针绑定结果A,因为就所main涉及的而言,B它不是一个A(以你不能做的方式A * p = new unrelated;)

至于为什么需要它,答案完全相同:因为无法访问关系,编译器不知道(好吧,它知道,但不会告诉你)如何获取指向A内部主题的指针B,因为as只要能使该范围内看有没有关系A,并B在所有.