Ir para conteúdo
Fórum Script Brasil
  • 0

Herança classe "Neta"


Rafael Abrantes Penchel

Pergunta

Boa tarde,

Estou com um erro de compilação que sinceramente não entendo a razão. Seja a seguinte classe pai:

http://pastebin.com/uiAZFmUx

Em seguida faço uma herança do tipo public, e na outra classe faço "herança de herança" (não sei o termo para isso)

http://pastebin.com/Zcnu9vsY

quando vou definir o constructor, ( http://pastebin.com/ZzgBqJWB ) o compilador diz que:

'antenna::Npt' : cannot access protected member declared in class 'antenna'

'antenna::Type' : cannot access protected member declared in class 'antenna'

Como não posso acessar Npt e Type se são declarados como protected, e estou acessando-os de uma classe derivada da classe pai?

Desde já agradeço a atenção.

Obrigado.

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

O problema não ocorre porque a tentativa de acessar o membro protected é feita pela classe "avô". A classe classic tem acesso aos atributos protected da classe antenna, mas só tem acesso aos valores do próprio objeto. Ou seja:

classic::testFunc(){
Npt=5; //isso funciona, pois está trabalhando com um atributo do mesmo objeto (this->Npt)

antenna a;
a.Npt=10; //isso não funciona, pois trabalhamos com um atributo de outro objeto (a.Npt)
}
Recomendo a leitura desse artigo: Proteção dos membros protected. A solução é, ao invés de você tentar ler os atributos de inAnt, passar esse objeto para o construtor de cópia da classe antenna, pois o construtor tem acesso a qualquer propriedade da mesma classe. O seu código ficar assim:
class antenna
{
public:
    // constructors
    antenna(const int inNpt, char * inType);
    antenna();
    ~antenna(){};


    // protected member varibles
protected:
    vector<double> * sub_reflector;
    vector<double> * main_reflector;

    int Npt;
    char * Type;
};

class omnidirectional : public antenna
{
public:
    omnidirectional(antenna);
    ~omnidirectional(){};

protected:
    vector<double> P1, P2, Q;
    double Wa, Vs, Ds, Vm, Dm, Db, Zb, Gama, thetaE;
};
omnidirectional::omnidirectional(antenna x)
    :antenna(x) //chama o construtor de cópia de antenna
{
}


// class classic omnidirectional antennas;
class classic : public omnidirectional
{
public:
    classic(antenna inAnt, double inWa, double inVs, double inDm, double inDb, double inZb,
        double inLb, double inGama);
    classic();
    ~classic(){};
};

    classic::classic(antenna inAnt, double inWa, double inVs, double inDm, double inDb, double inZb,
                 double inLb, double inGama)
                 :omnidirectional(inAnt) //construtor de omnidirectional
{
    Wa = inWa * inLb;
    Vs = inVs * inLb;
    Dm = inDm * inLb;
    Db = inDb * inLb;
    Zb = inZb * inLb;
    Gama = inGama * pi/180;
}

Não sei se seu código está realmente assim ou se adaptou para postar, mas acho que não faz muito sentido passar um objeto antenna para a classe classic, já que ela não deriva diretamente de antenna, e sim de omnidirectional. Acho que faria mais sentido passar um objeto da classe omnidirectional para o construtor de classic ao invés de um antenna.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...