为何C++私有继承时无法将派生类地址赋值给基类指针,公有继承正常?
问题原因解答
这一编译报错是C++不同继承方式下的隐式类型转换规则导致的,具体逻辑如下:
- C++的三种继承方式(
public/protected/private)会严格控制派生类到基类的转换权限:- 只有公有继承对应面向对象的is-a关系,编译器允许在全局/类外作用域将派生类的指针、引用隐式转换为基类的指针、引用,这也是你将继承改为
public后报错消失的原因。 - 私有继承、保护继承不属于对外暴露的is-a关系,这种继承模式下,基类的所有public/protected成员都会变成派生类的private/protected成员,仅在派生类内部可访问,类外作用域完全感知不到派生类和基类的继承关系,因此不允许在类外做派生类到基类的隐式转换。
- 只有公有继承对应面向对象的is-a关系,编译器允许在全局/类外作用域将派生类的指针、引用隐式转换为基类的指针、引用,这也是你将继承改为
- 你的代码中
Derived以私有方式继承Base,main函数属于类外作用域,执行bptr = &d;时尝试做隐式转换自然会被编译器拦截。
补充说明:私有继承通常用于实现「派生类复用基类实现,但对外完全隐藏继承关系」的需求,等价于把基类当做派生类的一个私有成员使用,这种场景下本来就不应该对外暴露基类指针。
内容的提问来源于stack exchange,提问作者Nikhil
相关产品推荐
相关产品推荐

