Created
December 1, 2011 18:22
-
-
Save mauricioszabo/1418744 to your computer and use it in GitHub Desktop.
Diferenças entre "private" no Ruby e C++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Versão em C++. Repare que quando é chamado o método "publico" numa instância da | |
//classe filha, ela usa a implementação tanto do método "publico" como o "privado" | |
//da classe pai. | |
//Se eu não tivesse redefinido o método "privado" na classe filha, eu teria um erro | |
//de compilação ao tentar acessar "privado" da classe pai. Da mesma forma, diferente | |
//de ruby, se eu estiver no escopo certo eu posso chamar um método privado com a | |
//notação this->privado() | |
#include <iostream> | |
using namespace std; | |
class Algo { | |
public: | |
void publico() { | |
privado(); | |
} | |
private: | |
void privado() { | |
cout << "Privado!\n"; | |
} | |
}; | |
class Balgo : public Algo { | |
public: | |
void publicoDois() { | |
privado(); | |
} | |
private: | |
void privado() { | |
cout << "Privado da classe filha!\n"; | |
} | |
}; | |
int main(int argc, const char *argv[]) | |
{ | |
Algo a; | |
Balgo b; | |
a.publico(); //Imprime "Privado!" na tela | |
b.publicoDois(); //Imprime "Privado da classe filha!" na tela | |
b.publico(); //Imprime "Privado!" na tela | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#Versão em Ruby. Repare que quando eu redefino "privado" na classe filha, mesmo o | |
#método "publico" sendo definido na classe pai, passa a usar o método da classe filha. | |
#Da mesma forma, eu posso chamar "privado" na classe filha (se eu não tivesse re-definido | |
#o método) sem problemas. Em nenhum caso, porém, eu posso chamar um método privado | |
#usando a notação "self.privado". | |
class A | |
def publico | |
privado | |
end | |
def privado() | |
puts "Privado!" | |
end | |
private :privado | |
end | |
class B < A | |
def publico_dois | |
privado | |
end | |
def privado | |
puts "Privado da classe filha!" | |
end | |
private :privado | |
end | |
a = A.new | |
a.publico #Imprime "Privado!" na tela | |
b = B.new | |
b.publico_dois #Imprime "Privado da classe filha!" na tela | |
b.publico #Imprime "Privado da classe filha!" na tela |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Versão em C++, usando métodos virtuais. Repare que, agora, quando eu chamo o | |
//método "publico" numa instância da classe filha, ele usa o método "privado" da classe | |
//filha, pois o método "privado" foi definido na classe pai como "virtual". PORÉM, | |
//todas as regras do C++ continuam valendo, ou seja, se nesse caso eu não tivesse | |
//redefinido o método "privado" na classe filha, eu não conseguiria acessá-lo pelo | |
//método "publicoDois". | |
#include <iostream> | |
using namespace std; | |
class Algo { | |
public: | |
void publico() { | |
privado(); | |
} | |
private: | |
virtual void privado() { | |
cout << "Privado!\n"; | |
} | |
}; | |
class Balgo : public Algo { | |
public: | |
void publicoDois() { | |
privado(); | |
} | |
private: | |
void privado() { | |
cout << "Privado da classe filha!\n"; | |
} | |
}; | |
int main(int argc, const char *argv[]) | |
{ | |
Algo a; | |
Balgo b; | |
a.publico(); //Imprime "Privado!" na tela | |
b.publicoDois(); //Imprime "Privado da classe filha!" na tela | |
b.publico(); //Imprime "Privado da classe filha!" na tela | |
return 0; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment