Najprej bomo uporabili polimorfizem, ki se imenuje ad-hoc polimorfizem ali drugače - za silo narejen polimorfizem.
Razlika med int, float, ... polimorfizmi je v velikosti obsega in tako prostora v pomnilniku, ki ga zaseda en predmet posameznega razreda (tipa). Če vemo kje je element in kako velik je, lahko naredimo izvedbeni modul neodvisno od int, float, ...
Izhajali bomo iz razreda skladov celih števil SKLAD_NO.h in opisali potrebne spremembe na njem. Najprej kreatorju dodamo parameter, ki pove, koliko prostora zavzame en element (predmet) naložen na sklad.
Zakaj imamo sedaj dva kreatorja? (ponovitev)
Ta dva kreatorja sedaj razširimo na:
Poleg tega spremenimo še ostale funkcije:
V izvedbenem modulu sta spremenjene funkcije za nalaganje, zlaganje in
vračanje vrha. Za razliko od starega nalaganja, kjer je bil predmet
prenešen po vrednosti in smo ga lahko v enem kosu naložili na sklad,
moramo pri novem nalaganju to početi po koščkih. En košček je veliko
kot en znak (char), njihovo število pa je določeno ob
kreiranju - velElt:
for(i= 0; i < velElt; i++)
ptr_skladisce[zadnji][i]=element[i];
Sedaj lahko uporabljamo naš ad-hoc polimorfni razred skladov
predmetov na naslednji način:
int main() {
Sklad s1(sizeof(int)); // kliče: Sklad(velElt)
Sklad s2(sizeof(int), 3); // kliče: Sklad(velElt, min_vel_sklad)
Sklad s3(sizeof(float));
Sklad s4(sizeof(Crac));
int i;
float f;
Crac r;
s1.Nalozi(&i);
s2.Nalozi(&i);
s3.Nalozi(&f);
s4.Nalozi(&r);
return 0;
}; // main
Žal po nesreči lahko napišemo tudi:
s4.Nalozi(&i);
in naš program bo deloval napačno. Formalno gledano smo kršili
pogodbo, saj predpogoj zahteva, da je sklad s4 sklad
racionalnih števil in ne celih.