Newsgroup: it.comp.lang.c++
Titolo: Hiding e overloading

Salve,
potreste farmi un es di hiding e di overloading dei metodi?
l' hiding avevo pensato fosse:
class base {
 public:
 void metodo (int x) {};
};
class der : public base {
 public
 void metodo (int y) {}; // essendo ridefinito nasconde il metodo della
classe base
};
der obj;
int main ()
 obj.metodo(5);
 return 0;
}
è cosi?
l'overloading so che si effettua tra metodi con lo stesso nome ma segnatura
diversa, quindi ho pensato:
class base {
 public:
 void metodo (int x) {};
};
class der : public base {
 public
 void metodo (string y) {}; // essendo ridefinito nasconde il metodo della
classe base
};
der obj;
int main ()
 obj.metodo(5); // errore! parametro non corrispondente etc...
 return 0;
}
io pensavo che non trovando corrispondenza con il metodo della classe der,
risalisse a quello della classe base... ma non è così!
Grazie

 };
No. Anche questo e' un esempio di hiding.
Qualunque signature inserita nella classe derivata nasconde tutte le signature
aventi lo stesso nome nella classe base e nello scope esterno indipendentemente
dai parametri. L'overloading avviene fra signature che stanno nello stesso scope
e hanno lo stesso nome ma diversi parameteri. Esempio:
class base {
public:
    void metodo (int x);
};
class der : public base {
public:
    void metodo(long y);
    void metodo(float z);
};
"void base::metodo(int)" is hidden in der::
"void der::metodo(long)" and "void der::metodo(float)" are overloads of metodo
in der::
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

Scusa l'OT ma... e' poco che "giro" qui ma ho gia' visto
"Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0"
Cos'e'?

 Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0"
Fra un po' diventa una FAQ!!
E' un test fattibile via internet. Ovviamente in inglese. Il sito e'
http://www.brainbench.com
. Se sai l'inglese li ti spiegano tutto. Se non lo sai,
beh, il test non lo puoi fare se non sai l'inglese.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 e hanno lo stesso nome ma diversi parameteri. Esempio:
Ah, questo già lo sapevo. Se sono nello stesso scope certo. Pensavo solo
come dovesse essere fatto tra metodi in classi diverse.
Grazie
Luigi

 risalisse a quello della classe base... ma non č cosě!
No, proprio perche` cio` che hai eseguito e` overriding (con
conseguente hiding della funzione di classe base) e non overloading
(che invece non nasconde).
Paolo
--
Paolo Marotta
Home: 
http://web.tiscalinet.it/paolo_marotta
Master's Level in C++ Certified by Brainbench
http://www.brainbench.com/transcript.jsp?pid=2440649

 (che invece non nasconde).
Hiding si. Overriding e' un'altra cosa.


 come dovesse essere fatto tra metodi in classi diverse.
Ovviamente per definizione non esiste l'overload di due nomi diversi (lo stesso
unqualified in due scope diversi e' in realta' due nomi diversi). Pero' se la
domanda e' come sovraccaricare un nome presente in uno scope con nomi presenti
in uno scope diverso rendendoli visibili nello scope stesso ... la soluzione e'
"using".
namespace ns1 {
    void foo();
    void bar();
}
namespace ns2 {
    using ns1;
    void foo(int);
    void bar(int);
}
namespace ns3 {
    using ns1::foo;
    void foo(int);
    void bar(int);
}
Nomi non sovraccaricati:
ns1::foo
ns1::bar
ns3::bar
Nomi sovraccaricati:
ns2::foo
ns2::bar
ns3::foo
E lo stesso per ereditarietà:
struct A {
    void foo();
};
struct B: A {
    using A::foo;
    void foo(int);
};


 di una funzione virtuale presente in una delle basi.
Vero... ho fatto un poco di confusione. Spiacente!
