以下简单示例将产生编译器错误,因为我意外地使用私有继承:
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派生的.
你能帮我解释一下基类中究竟什么是不可访问的,以及为什么从B*到A*的转换需要它?
的Ouside B和的朋友B,这个简单的事实B 是 A不可见的.这不是隐藏成员变量或成员函数,而是隐藏关系本身.这就是为什么main你不能new B用指针绑定结果A,因为就所main涉及的而言,B它不是一个A(以你不能做的方式A * p = new unrelated;)
至于为什么需要它,答案完全相同:因为无法访问关系,编译器不知道(好吧,它知道,但不会告诉你)如何获取指向A内部主题的指针B,因为as只要能使该范围内看有没有关系A,并B在所有.