2014-11-21 5 views
1

Я пишу следующую структуру:Наследование и защищенный атрибут

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 :: производной» прямо сейчас. две мои первые строки являются:

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

} 

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

но Xcode рассказывает мне на второй линии в «T :: производной», что 'i' is a protected member of 'F. Я не могу понять, почему у меня нет доступа к нему, когда я нахожусь в «Т», который наследуется от «F».

ответ

2

Участник класса T может работать только с защищенными объектами класса класса T (в том числе с использованием объекта), а не произвольными объектами класса F или другими подтипами.

Независимо deriv должен быть (на данный момент, что это неинициализированные указатель, так что вы должны были бы большие проблемы, даже если код сделал компилировать), он должен будет быть T* (или подтип T) для того, для доступа к нему i. Либо это, либо i, должно быть более широко доступно.

0

Так как защищенные члены доступны только (Sub Class) T (здесь) (поскольку только класс derueded из базы F). Чтобы получить доступ к i (защищенный член), создайте экземпляр T и используйте i. Здесь изменить это

F* deriv; 
T* deriv; 

и вы исчезли ваша ошибка.

+1

Это не связано с тем, чтобы быть абстрактным. В этом контексте вы можете получить доступ к открытым членам абстрактного типа; просто не закрытые члены или защищенные члены посредством указателей на типы, отличные от 'T', из-за правил доступа для всех классов (абстрактные или иные). –

Смежные вопросы