2016-10-30 3 views
-4

Я получаю эту ошибку в наследстве (C++) ниже:наследования C++ защищенного

B.cpp:11:9: error: 'isMember' is a protected member of 'A' 
    if(x->isMember()) 

Я видел, что объявленный защищенный член в классе «матерей» достижим из аа элемента из «дочка». Но я все еще не понимаю, в чем проблема. Вот определение в моих двух классах А и Б:

#ifndef _A_H_ 
#define _A_H_ 
class A 
{ 

    private: 
    bool _member; 

    public: 
    A(); 
    virtual ~A(); 

    protected: 
    bool isMember(); 
    }; 
#endif // _A_H_ 

//A.cpp 
#include "A.h" 

A::A(){_member=true;} 

A::~A(){}; 

bool A::isMember() 
{ 
    return _member; 
} 

//B.h 

#ifndef _B_H_ 
#define _B_H_ 
#include "A.h" 

class B : public A 
{ 
private: 
    A * _memberB; 

public: 
    B(A *x); 
    ~B(); 

}; 
#endif // _B_H_ 

//B.cpp 

#include "B.h" 
#include "A.h" 

B::B(A * x) 
{ 
    if(x->isMember()) // call of the protected member of class A 
    this->_memberB=x; 
} 

B::~B() 
{ 
    //cout<<"B--"<<endl; 
    delete this->_memberB; 
} 

//main.cpp 
#include "B.h" 

int main() 
{ 
    A * a= new A(); 

    B * b= new B(a); 

    return 0; 
} 
+0

Потому что вы пытаетесь получить доступ к методу из объекта 'A'. Iirc, protected означает, что подкласс может использовать член внутри себя, но он не может получить доступ к члену родителя; только его собственный. – Carcigenicate

+0

да, но почему объект родительского класса не может вызвать свой метод в подклассе. Это то, что я не понимаю – Anass

+0

Внутри класса B вы можете вызвать isMember для объектов B. Вы не можете вызвать isMember для объектов A изнутри B. Это именно то, что защищено. – Carcigenicate

ответ

0

защищена в C++ является в классе не за объект основы

за объект:
вы наклоненный доступ родительского класса защищен член через дочерний объект снаружи, даже если ребенок может защищаемую функция на самом деле доступ родителей:

Child c; 
c.protectedFunction(); // wont work, because you are calling protectedFunction() outside the child object. 

за класс
но вы можете получить доступ к нему через дочерний класс:

class Child : public Parent 
{ 
    public: 
     void someFunction() 
     { 
      protectedParentFunction(); // it works! you are callign it from Child class 
     } 
} 

, чтобы решить вашу проблему, вы должны написать публичную функцию внутри класса ребенка, который вызывает защищенную функцию из класса Parent.

class Child : public Parent 
{ 
    public: 
     void callerOfProtectedFunction() 
     { 
      protectedParentFunction(); 
     } 
} 
Child c; 
c.callerOfProtectedFunction(); 
+0

Я понимаю, что вы имеете в виду. Но это не решает мою проблему. Моя проблема в том, что iif я делаю метод «isMember» общедоступным, тогда код будет работать, однако этот метод будет доступен за пределами классов, и это то, чего я боюсь. Есть ли решение решить эту проблему? – Anass

+0

@Anass Вот почему я сказал, чтобы сделать общедоступную функцию, которая вызывает защищенную функцию –

+0

@ АНАС theres всего около 2 способов, создать публичную функцию в классе B, которая вызывает защищенную функцию класса A, или сделать ваш класс B другом класса A. –

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