C++中protected继承的派生类为何无法通过对象访问基类public函数
问题核心原因
你的核心理解偏差在于:成员被派生类继承,不代表继承后你可以在类外部通过派生类对象直接访问,继承方式会直接修改基类成员在派生类中的访问权限。
C++继承权限映射规则
C++三种不同的继承方式,会直接改变基类成员在派生类中的可见性:
- public继承:基类的
public成员继承后仍为派生类public成员,基类protected成员继承后仍为派生类protected成员,基类private成员派生类无法直接访问 - protected继承:基类的
public、protected成员继承后统一变为派生类的protected成员,基类private成员派生类无法直接访问 - private继承:基类的
public、protected成员继承后统一变为派生类的private成员,基类private成员派生类无法直接访问
对应你的代码场景说明
你使用的是protected继承,基类Vehicle的public方法getDetails()继承到Car类后,就变成了Car的protected成员。而protected成员的访问规则是仅允许在类内部、子类内部访问,不允许通过类对象在类外部访问,所以你写的obj2.getDetails()直接触发权限报错。
验证&解决方法
- 如果你只是需要在
Car类内部使用getDetails(),直接在类内部调用是合法的,示例如下:
class Car : protected Vehicle { public: void printMyInfo() { getDetails(); // 类内部访问继承的protected成员,不会报错 } };
- 如果你需要在类外部通过
Car对象直接调用getDetails(),可以选择两种方案:- 将继承方式改为
public继承:class Car : public Vehicle - 保留
protected继承,在Car类中显式声明将getDetails()的访问权限提升为public:
class Car : protected Vehicle { public: using Vehicle::getDetails; }; - 将继承方式改为
内容的提问来源于stack exchange,提问作者Magzash
相关产品推荐
相关产品推荐

