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

C++ OOP中通过指针访问类成员报错原因咨询

错误原因与解决办法

错误原因

A::x被声明为protected成员,子类B的成员函数仅能访问自身实例中继承自A的x,或者B类(及B的派生类)实例中继承自A的x。但你在B::out()里通过A* p指向了一个独立的A对象,此时通过p->x直接访问A类的protected成员,这不符合C++的访问权限规则,因此编译器报错。

解决办法

方案1:通过public接口访问(推荐,符合封装原则)

给A类添加一个public成员函数,用于获取x的值,避免直接访问protected成员:

#include <iostream>
using namespace std;

class A
{
    protected:
        int x;
    public:
        A() { x=10; }
        // 新增public方法获取x
        int getX() const { return x; }
};

class B:public A
{
   public:
   void out()
   {
       A *p=new A;
       cout << p->getX();
       delete p; // 记得释放动态分配的内存,防止内存泄漏
   }
};

int main()
{
   B b;
   b.out();
   return 0;
}

方案2:访问自身继承的x(如果需求是输出当前B对象的x)

如果你原本想输出的是当前B实例中继承自A的x,而不是新创建的A对象的x,直接访问即可:

#include <iostream>
using namespace std;

class A
{
    protected:
        int x;
    public:
        A() { x=10; }
};

class B:public A
{
   public:
   void out()
   {
       cout << x; // 访问当前B对象继承自A的x
   }
};

int main()
{
   B b;
   b.out();
   return 0;
}

方案3:将x改为public(不推荐,破坏封装)

直接把A中x的访问权限改为public,虽然能解决问题,但会破坏类的封装性,不建议使用:

class A
{
    public: // 修改为public
        int x;
    public:
        A() { x=10; }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:43:16