Newsgroup: it.comp.lang.c++
Titolo: OT: domanda ...

Scusate se questo post è un pò OT ma non sapevo in quale altro gruppo
mandarlo...
Quali sono le tecniche usate per implementare il polimorfismo
parametrico in C++, Java e C#?
In quale dei tre linguaggi i metodi possono essere virtuali?
Grazie

 
-- 
Matteo Settenvini
FSF Associated Member
Email : 
mat...@member.fsf.org
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d--(-) s+:- a-- C++ UL+++
P?>++ L+++>$ E+>+++ W+++ N++ o?
w--- O- M++ PS++ PE- Y+>++
PGP+++ t+ 5 X- R tv-- b+++ DI+
D++ G++ e h+ r-- y?
------END GEEK CODE BLOCK------

Scusa Matteo, mi sono appena accorta di aver posto male la domanda.
La domanda era questa:
In quale dei tre linguaggi i metodi polimorfi possono essere virtuali?
Grazie 1000.

kiki ha scritto:

Siamo sempre lì... con una riserva su C# (so che esistono due parole
chiave, virtual e override, che hanno effetti diversi, ma non so di
preciso quali); per gli altri ciò che cambia è il "quando sono a
disposizione" i metodi virtuali delle sottoclassi (insomma: quando viene
aggiornata la vtable).
Per esempio, le stampe di questi due frammenti di codice, evidenziano
una importante differenza tra C++ e Java:
// C++ ---------------------------
#include <iostream>
using namespace std;
class B {
public:
	B() { f(); }
	virtual void f() { cout << "B::f()" << endl; }
};
class C : public B {
public:
	void f() { cout << "C::f()" << endl; }
};
int main( int argc, char* argv ) {
	C c;
}
// --------------------------------
 
// Java ---------------------------
public class Prova {
	public static void main( String[] args ) {
		C c = new C();
	}
	static private class B {
		B() { f(); }
		void f() { System.out.println("B.f()"); }
	}
	static private class C extends B {
		void f() { System.out.println("C.f()");	}
	}
}
// ---------------------------------
 
Il che dimostra anche che in Java i metodi non statici sono sempre e
comunque virtuali. On passant, in Java puoi accedere con la parola
chiave "super" ai metodi della classe che stai estendendo.
Quindi la risposta alla domanda rimane: in tutti e tre. Dopotutto, il
polimorfismo senza i metodi virtuali proprio non me lo vedo. :-)
Forse volevi sapere quando i metodi virtuali possono essere astratti?
In tutti e tre comunque: in C++ basta aggiungere "= 0" dopo la
dichiarazione del metodo, in Java il metodo va invece marcato con la
parola chiave "abstract"; in C# non so, il meccanismo sarà analogo.
Ciao,


 (ovviamente non si considerano i metodi statici).
Mà no. In Java, le funzionni son virtuale per default, bisogna
dichiarle "final" alfine che non sianno virtuale. (E anche
possibile dichiare una classa intiera "final", per rendere tutte
le sue funzionni non virtuale.) In C++, le funzionni non sone
virtuale per default, bisogna dichiarle "virtual" alfine che
sianno virtuale. (Non conosco il C++.)
--
James Kanze                                           GABI Software
Conseils en informatique orientée objet/
                   Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, 
+33 (0)1 30 23 00 34

 


 Ed allora perché stai postando alla grande in questo newsgroup? lol.
evidentemente intendeva C# e si e' sbagliato a scrivere, no? (si parlava
di 3 linguaggi, ha parlato di due ed il terzo ti ha detto di non
conoscerlo).
Tommaso
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 
Ah, okay, colpa mia. Avevo mal interpretato le parole di James.
Pardon,
