- polymorfisme i c + +

, ord, pluralisme, betyder, at mange former.typisk polymorfisme opstår, når der er et hierarki af klasser, og de er forbundne ved arv, c + + - polymorfisme betyder, at en opfordring til et medlem funktion vil medføre en anden funktion at blive henrettet, afhængigt af, hvilken type objekt, der påberåber sig funktion. overveje følgende eksempel, hvor en base klasse er afledt af andre to klasser:,&#omfatter < iostream > anvendelse af namespace std. klasse form (beskyttede: int bredde, højde, offentlige: form (int a = 0, int b = 0) (bredde - og højde = b} int area() {cout < < "forælder klasse område:" < < endl., tilbage, 0) og klasse rektangel: offentlige form {offentlige: rektangel (int a = 0, int b = 0): form (a, b) {} int område () (cout < < "rektangel klasse område:" < < endl., afkast (bredde * højde)) og klasse trekant: offentlige form {offentlige: trekant (int a = 0, int b = 0): form (a, b) {} int område () (cout < < "trekant klasse område:" < < endl., afkast (bredde * højde /2)}}; //vigtigste funktion i programmet int vigtigste () (form * form; rektangel rec (10,7); trekant tri (10,5); //butik adressen på rektangel form = & rec; //kalder rektangel område.form - > area(); //butik adressen på trekant form = & tri; //kalder trekant område.form - > area(); tilbage 0}, når ovennævnte adfærdskodeks er udarbejdet og gennemført, giver følgende resultat:, forælder klasse område forælder klasse område, til grund for ukorrekt output er, at indkaldelsen af den funktion, area() sættes gang i den anden som den version, som defineret i basen klasse.dette kaldes, statisk beslutning, funktion, eller statiske sammenkædning - funktion er fastsat før programmet er gennemført.det er også nogle gange kaldte, tidlig bindende, fordi de area() funktion er fastsat under udarbejdelsen af programmet, men lad os nu få en mindre ændring i vores program og forud for anmeldelse af area() i form af klasse med nøgleordet, virtuel, så det ser ud, som om dette: klasse form (beskyttede: int bredde, højde, offentlige: form (int a = 0, int b = 0) (bredde - og højde = b) virtuelle int area() {cout < < "forælder klasse område:" < < endl., tilbage, 0); efter denne lille ændring, da den tidligere eksempel kode er udarbejdet og gennemført, giver følgende resultat:, rektangel klasse område trekant klasse område, denne gang, -mpiler ser på indholdet af de point i stedet for den type.eftersom adresser af genstande af tri - og rec klasser er oplagret i * form de respektive area() funktion kaldes. som du kan se, hver af barnet klasser har en særskilt gennemførelse for den funktion, area().det er sådan, pluralisme, anvendes i almindelighed.du har forskellige klasser med en funktion af samme navn, og selv de samme parametre, men med forskellige implementeringer, virtuelle funktion:,, virtuel, funktion er en funktion i en klasse, der er angivet ved hjælp af basen nøgleordet, virtuel,.at definere på en base klasse en virtuel funktion, med en anden udgave i en afledt af klasse, signaler til den anden, at vi ikke vil have statisk sammenhængen for denne funktion. det, vi ønsker, er valget af den funktion, at blive kaldt til et bestemt punkt i programmet er baseret på en genstand, som den kaldes.denne form for operation, der kaldes, dynamisk sammenhæng, eller sent bindende,., rent virtuelt funktioner: det er muligt, at du havde lyst til at omfatte en virtuel funktion i en base klasse, således at det kan omdefineres i en afledt af klasse til målene for denne klasse, men der er ingen meningsfuld definition kan du give for den funktion i basen klasse. kan vi ændre det virtuelle funktion area() i basisklasse for følgende: klasse form (beskyttede: int bredde, højde, offentlige: form (int a = 0, int b = 0) (bredde - og højde = b} //rent virtuelt funktion virtuelle int area() = 0}, = 0 fortæller de, at den funktion, har ingen krop over virtuelle funktion vil være called rent virtuelt funktion.



Previous:
Next Page: