You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()直接触发权限报错。


验证&解决方法

  1. 如果你只是需要在Car类内部使用getDetails(),直接在类内部调用是合法的,示例如下:
class Car : protected Vehicle
{
public:
    void printMyInfo() {
        getDetails(); // 类内部访问继承的protected成员,不会报错
    }
};
  1. 如果你需要在类外部通过Car对象直接调用getDetails(),可以选择两种方案:
    • 将继承方式改为public继承:class Car : public Vehicle
    • 保留protected继承,在Car类中显式声明将getDetails()的访问权限提升为public:
    class Car : protected Vehicle
    {
    public:
        using Vehicle::getDetails;
    };
    

内容的提问来源于stack exchange,提问作者Magzash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:27:03