Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

arestides

Ajuda-POO-C++

Mensagens Recomendadas

arestides

Boas,

tenho algumas duvidas relacionadas com a Programação Orientada a Objectos e a Linguagem C++, se alguém me conseguir ajudar agradecia imenso. ;)

1-Gostava de saber pq as funções virtuais não se podem expandir em inline e se possível alguns exemplos em c++ que o explique.

2-Pq o c++ não assegura completamente o encapsulamento e por isso não ser considerada uma LOO "pura" e mais uma vez alguns exemplos em c++ que demonstrem isso mesmo.

3-Quais as vantagens da passagem de argumento por referencia em c++ e quais as alternativas a essa opção e diferenças de funcionamento destas.

Agradeço desde já a vossa ajuda. ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mogers

1) Em tempo de compilação, é possível substituir a chamada a uma função virtual pelo seu "corpo" propriamente dito?

2) Não percebi bem a pergunta

3) http://www.fredosaurus.com/notes-cpp/functions/refparams.html


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
arestides

Obrigado pela ajuda, estou a preparar-me para exame e estas perguntas são as que estão a ser mais difíceis para mim.

O que eu entendi:

1- As funções virtuais são definidas na superclasse e é invocada por um ponteiro. Nas funções inline o código tem de estar onde ela é chamada. Como as funções virtuais tem de ser invocadas com ponteiros é impossível que esta se estenda em inline...é isso?

2-Em relação a esta questão penso k a resposta é a herança múltipla, pois o c++ permite a sua utilização e esta viola o principio do encapsulamento. Mas explicar isso com um exemplo pratico é k é mais complicado.... 🤔

3-Obrigado pela sugestão, esta muito bem explicado... :confused:

Aguardo por mais sugestões e obrigadão mogers.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mogers

1- As funções virtuais são definidas na superclasse e é invocada por um ponteiro. Nas funções inline o código tem de estar onde ela é chamada. Como as funções virtuais tem de ser invocadas com ponteiros é impossível que esta se estenda em inline...é isso?

Na minha opinião, isso não chegava para responder. Toma como exemplo o uso de um polimorfismo simples: imagina que tens um apontador para objectos da classe A (e existem classes derivadas usando base pública).

E considera este código hipotético:

class A {
    int t;
    public: 
        // outras coisas da classe
        inline virtual void f(int a);
};
// ...
A * ptr;
// ...
ptr->f(0);

Nesta chamada da função f, é impossível que o compilador saiba (em tempo de compilação) qual é o verdadeiro tipo do objecto para o qual ptr aponta (podia ser um dos subtipos de A que poderia redefinir essa função). Assim, é impossível que o compilador possa substituir esta invocação da função pelo corpo da função.

Quanto à 2, não sabia que o c++ não respeitava completamente o encapsulamento. Tens alguma referência (link de preferência) que confirme que a herança múltipla não respeita?


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
arestides

Com o exemplo é mais facil de entender.

A unica referencia é o livro pelo qual estou a estudar: "Programação em c++, Algoritmos e estruturas de dados e objectos" do Luis Aguilar. O que diz é mais ou menos isto:

"Herança multipla apresenta problemas como ambiguidade de nomes por usar nomes identicos em diferentes classes-base e preponderancia de funções ou dados..... Aspecto negativo é a violação do encapsulamento de dados pois para resolver conflitos de nomes os detalhes da implementação tem de ser conhecidos. "

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mogers

Não me lembrei do "friend". Bem visto :confused:


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.