访问受保护数据成员的C ++继承

时间:2018-02-07 20:38:43

标签: c++ inheritance

类的子级是否可以访问派生类的对象的数据成员?

例如,我有这段代码。

class word
{
protected:
    char * a_word;
    word * next;
};

class texting : public word
{
public:
    word * checkPhrase(char * token, word * curr);
};

word * texting::checkPhrase(char * token, word * curr)
{
    if (curr)
    {
        if (strcmp(token, a_word) == 0)
            return curr;
        else
            return checkPhrase(token, curr->next);
    }
    else
        return NULL;
  }

我希望这能够编译并正常工作,但是当我尝试编译它时,它告诉我word * next是一个受保护的变量,我无法访问它,引用该行

return checkPhrase(token, curr->next);

2 个答案:

答案 0 :(得分:0)

  

一个类的子进程可以访问该对象的数据成员   衍生类?

是的,但是它自己的成员,而不是其他对象成员。您正在访问的是作为参数传递的对象的受保护成员,并且此对象来自基类,而不是此对象的同一个类,即checkPhrase方法可以从基类访问其自己的成员如果它们是公共的或受保护的,但不是基类的另一个对象的受保护或私有成员,即使此对象来自此对象的基类。

举个例子:

word * texting::checkPhrase(char * token, word * curr)
  {
      // this object
      this->next = nullptr; // this is valid
      next = nullptr; // this too

      // curr object
      curr->next = nulltr; // we are talking about an object of a different class and the variable has protected access.
  }

答案 1 :(得分:0)

你做不到。您只能访问自己类的对象的受保护成员。这是基类的对象,因此无法访问。

这里最简单的解决方案是在word类中添加一个公共getter函数:

public:
    word* get_next() const
    { return next; }

并使用它:

return checkPhrase(token, curr->get_next());

此外,您应该将word中当前受保护的成员设为私有。受保护的成员变量几乎不是一个好主意。受保护的函数成员很好,但受保护的成员变量通常不是。