Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
arestides

Ajuda-POO-C++

Recommended Posts

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. ;)

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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. "

Share this post


Link to post
Share on other sites
Metaluim

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).

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.