C++多级protected继承场景下基类指针指向派生类对象编译报错问题
C++ protected多级继承转型问题原理说明
首先复现问题代码:
#include <iostream> using namespace std; class A { protected: int a1; }; class B: protected A { protected: int b1; }; class C: public B { public: C() { a1=10; b1=20; cout<<a1<<b1<<endl; } }; int main() { C c; A* a= new C; // 编译报错:cannot cast 'C' to its protected base class 'A' }
核心原因:两种权限规则的区别
你遇到的差异本质是成员访问权限和继承关系可见性权限是两套独立的规则:
- 成员访问权限:控制能否访问类内的成员变量/成员函数
- 继承关系可见性:控制外部代码是否知道派生类和基类的继承关系,能否做向上转型
为什么C类内部可以访问A的protected成员
B以protected方式继承A后,A的所有public/protected成员在B中的访问级别都会变为protected。C公有继承B后,自然可以访问B的protected成员,也就是间接继承到的A的a1成员,这符合成员访问权限的规则。
为什么main函数中无法将C对象转为A类指针
protected继承的特性就是:继承关系仅对派生类自身和派生类的子类可见,对类外的其他代码(比如这里的main函数,不属于A/B/C任何一个类的成员)完全不可见。
类外代码不知道C和A存在继承关系,自然不允许执行派生类到基类的向上转型操作,因此编译报错。
补充说明:如果需要在类外执行这个向上转型,只需要把B对A的继承方式改为public即可,public继承的继承关系对所有代码可见。
内容的提问来源于stack exchange,提问作者amateur17
相关产品推荐
相关产品推荐

