c++ - 访问父级的 protected 变量

标签 c++

我想不出更好的标题措辞,所以这有点误导,但是,我不是在说 child 访问从其父级继承的变量,这很容易。

我说的是这个:

class Parent {
  protected:
     Parent *target;
     int hp;
}

class Child : public Parent {
  public:
     void my_func();
}

void Child::my_func() {
    target->hp -= 50;
}

但是,如果我尝试编译它,它会提示“hp”是“在这种情况下是私有(private)的”。问题是 child 不是试图访问它自己的 parent 的变量,而是其他一些类,它可能是也可能不是 child 本身。

一个对象可以访问同一个类的另一个对象(内存中的两个单独实例)的所有变量和方法(公共(public)的、 protected 或私有(private)的),所以我认为它也可以使用它,因为它继承自它试图访问其变量的类,但我的假设似乎是不正确的。

有什么建议吗?

附:不要粗鲁或任何事情,但我知道我可以创建 get() 和 set() 方法,但我希望有一种更清洁的方法。

最佳答案

特定类的成员函数只能访问基类的 protected 成员,这些成员实际上是它们自己的类类型(或更多派生类型)对象的基类子对象。

一个类的成员无权访问该基类的其他实例的 protected 成员,因此也禁止通过对基类类型的引用或指针访问 protected 成员,即使在运行时该指针或引用可能是到其成员函数正在尝试访问的类的类型的对象。访问控制在编译时强制执行。

例如

class X
{
protected:
    int z;
};

class Y : X
{
public:
    int f( const Y& y )
    {
        return y.z; // OK
    }

    int g( const X& x )
    {
        return x.z; // Error, Y::g has no access to X::z
    }
};

在您的示例中,在表达式 target->hp 中,对 target 的访问是合法的,因为您正在访问当前对象的成员(其类型为函数所属的类,Child),但访问成员 hp 是不合法的,因为 target 的类型不是指向 Child 的指针,而是指向 Parent 的指针。

关于c++ - 访问父级的 protected 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4829518/

相关文章:

C++ 从文件中读取

c++ - 知道为什么这个用户定义的文字会失败吗?

c++ - 连接两个 std::vectors

C++ 函数练习 - 不断返回零

c++ - 函数返回的字符串文字的生命周期

C++ 类或结构与 C 结构的兼容性

c++ - static_cast<T>(-1) 是在没有 numeric_limits 的情况下生成全一位数据的正确方法吗?

c++ - 从核心转储中获取创建时间

c++ - std::stringstream::flush() 应该做任何事情吗?

c++ - 无法使用 Boost 正则表达式构建