【问题标题】:Inheritance and protected attribute继承和受保护的属性
【发布时间】:2015-01-19 10:35:42
【问题描述】:

我正在编写以下结构:

class F {
protected:
    F* i;
public:
    F(){i=NULL;}
    virtual F* clone()const=0;
    virtual double operator()(double x)const=0; 
    virtual F* derivative()const=0;
    virtual double inverse(double y)const=0; 
    virtual ~F(){}

};

class T : public F{
    string n;
public:
    T(string n_);
    F* clone()const;
    double operator()(double x)const;
    F* derivative()const;
    double inverse(double y)const;
    ~T(){}
};

我现在正在编写方法“T::derivative”。我的前两行是:

F* T::derivative()const
{
    F* deriv;
    deriv->i=clone();

}

F* T::clone()const
{
    return new T(n);
}

但是 Xcode 在 'T::derivative' 的第二行告诉我 'i' is a protected member of 'F。 我不明白为什么当我在“T”中时无法访问它,它继承自“F”。

【问题讨论】:

    标签: c++ xcode4


    【解决方案1】:

    因为受保护的成员只能访问(子类)T(这里)(因为只能从基类 F 派生类)。要访问 i (受保护成员),请实例化 T 并使用 i 。 这里改成

    F* deriv;
    T* deriv;
    

    你的错误消失了。

    【讨论】:

    • 这与抽象无关。您可以在此上下文中访问抽象类型的公共成员;只是不是私有成员,也不是通过指向T 以外的类型的指针的受保护成员,因为所有类(抽象或其他)的访问规则。
    【解决方案2】:

    T 类的成员只能访问T 类对象(包括当前对象)的受保护成员,不能访问F 类或其他子类型的任意对象。

    无论deriv 应该是什么(目前,它是一个未初始化的指针,所以即使代码编译了你也会遇到大问题),它必须是T*(或@ 的子类型987654326@) 以便通过它访问i。要么,要么i 需要更广泛地访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2016-02-18
      • 2011-03-11
      • 2011-06-06
      • 2010-10-26
      相关资源
      最近更新 更多