【问题标题】:Accessing private member from derived class从派生类访问私有成员
【发布时间】:2021-11-02 14:46:48
【问题描述】:

这可能是一个微不足道的问题。有以下代码,

class message {
public:
    virtual void setMessage(const string& name, const int& age, const string& title) const;
    virtual void getMessage(const string& name) const;
private:
    void removeMessage(const string& name);
};

class test : public message {
public:
    using message::removeMessage;
};


int main()
{
    test t;
    t.removeMessage("_");

    while (1);
    return 0;
}

试图将 removeMessage() 公开为测试类的公共方法。但这给出了错误,

错误 C2876:“消息”:并非所有重载都可访问

如何将基类中的私有方法公开为派生类中的公共方法?

【问题讨论】:

  • private 暗示“无法从派生类访问”。你是不是想实现这个功能protected
  • @DrewDormann - 您可以将其添加为答案,我会接受。
  • 我认为现有的答案已经做得很好了。

标签: c++


【解决方案1】:

你不能。私有意味着它只能在它定义的类中访问,子类不符合这个定义。您可能需要protected 关键字。

class message {
public:
    virtual void setMessage(const string& name, const int& age, const string& title) const;
    virtual void getMessage(const string& name) const;
protected: //use protected instead
    void removeMessage(const string& name);
};

class test : public message {
public:
    using message::removeMessage;
};


int main()
{
    test t;
    t.removeMessage("_");

    while (1);
    return 0;
}

受保护的可以概括为“私有,但在基类中也可以访问”。

【讨论】:

    【解决方案2】:

    在派生类上永远不能访问私有成员。如果您的意图是让派生类访问基类的成员,则将其设为受保护或公开。

    【讨论】:

      猜你喜欢
      • 2018-04-19
      • 1970-01-01
      • 2017-08-07
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2011-08-04
      • 1970-01-01
      相关资源
      最近更新 更多