arestides Posted January 6, 2010 at 02:23 AM Report Share #304397 Posted January 6, 2010 at 02:23 AM 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. 😉 Link to comment Share on other sites More sharing options...
mogers Posted January 6, 2010 at 09:26 PM Report Share #304537 Posted January 6, 2010 at 09:26 PM 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. Link to comment Share on other sites More sharing options...
arestides Posted January 6, 2010 at 10:20 PM Author Report Share #304545 Posted January 6, 2010 at 10:20 PM 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... 😕 Aguardo por mais sugestões e obrigadão mogers. Link to comment Share on other sites More sharing options...
mogers Posted January 6, 2010 at 11:49 PM Report Share #304560 Posted January 6, 2010 at 11:49 PM 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. Link to comment Share on other sites More sharing options...
arestides Posted January 7, 2010 at 12:46 AM Author Report Share #304562 Posted January 7, 2010 at 12:46 AM 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. " Link to comment Share on other sites More sharing options...
Metaluim Posted January 7, 2010 at 01:02 AM Report Share #304566 Posted January 7, 2010 at 01:02 AM http://en.wikipedia.org/wiki/Diamond_problem o primeiro parágrafo diz tudo, mas C++, com alguns truques também podes aceder a membros privados (com apontadores) e também tens a keyword friend, que, quando uma classe Foo é "amiga" de uma classe Bar, a Foo tem acesso a toda a interface da Bar (privates incluídos). Link to comment Share on other sites More sharing options...
mogers Posted January 7, 2010 at 01:16 AM Report Share #304567 Posted January 7, 2010 at 01:16 AM Não me lembrei do "friend". Bem visto 😕 "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. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now