Avatar billede prox1 Forsker
29. marts 2020 - 14:57 Der er 6 kommentarer og
2 løsninger

Fordel ved Polymorphism

Der er muligt at bruge metoder med samme navn i samme klasse, og udelukkende lade parameterne udpege hvilken af funktionerne af samme navn som skal anvendes
Altså:
#include <iostream>
using namespace std;
class Sum {
  public:
    int add(int num1,int num2){
      return num1 + num2;
    }

    int add(int num1, int num2, int num3){
      return num1 + num2 + num3;
    }
};
int main(void) {
  //Object of class Sum
  Sum obj;
  //This will call the second add function
  cout<<obj.add(10, 20, 30)<<endl; //HER ER DER TRE PARAM

  //This will call the first add function
  cout<<obj.add(11, 22); //HER ER DER TO PARAM
  return 0;
}

.. 'fint' så....
Men
Vi kunne jo lige så godt have implenteret som:

#include <iostream>
using namespace std;
class Sum {
  public:
    int add2(int num1,int num2){ //FUNKTIONEN ANGIVER HVAD DEN KAN
      return num1 + num2;
    }
    int add3(int num1, int num2, int num3){
//FUNKTIONEN ANGIVER HVAD DEN KAN
      return num1 + num2 + num3;
    }
};


int main(void) {
  //Object of class Sum
  Sum objAdd;

  //This will call the second add function
  cout<<objAdd.add3(10, 20, 30)<<endl; //SPECIFIKT KALD

  //This will call the first add function
  cout<<objAdd.add2(11, 22); //SPECIFIKT KALD
  return 0;
}

2. program er langt mere læseværdigt
Hvorfor er polymorphism som i 1. program i det hele taget en 'ting'?
Avatar billede arne_v Ekspert
29. marts 2020 - 15:52 #1
1) det du beskriver er ikke polymorphism men method overload (hvis du tilgiver mig for at bruge enegelske termer)
Avatar billede arne_v Ekspert
29. marts 2020 - 15:55 #2
2) jeg mener at den første kode er mere læsevenlig end den anden - der er en matematisk operation add - der er ikke et uendeligt antal matematiske operationer add2, add3, add4, ... og navngivningen i den færste kode afspejler dette
Avatar billede arne_v Ekspert
29. marts 2020 - 15:56 #3
3) muligvis gav det mere mening hvis du i.s.f. forskelligt antal argumenter brugte forsellige typer af argumenter

int add(int a, int b)
double add(double a, double b)

(specielt med div er der en forskel her!)
Avatar billede arne_v Ekspert
29. marts 2020 - 15:58 #4
4) hvis man havde det her behov for add med vilkårligt antal argumenter så understøtter C++ faktisk variabelt antal argumenter s[ en enkelt metode kan understøtte 1 til uendeligt argumenter
Avatar billede prox1 Forsker
29. marts 2020 - 16:19 #5
Tak Arne
i relation til:
https://www.computerworld.dk/eksperten/spm/1032722?k=8351922
Min 'polymorfism' er ikke 'min', den kom herfra
https://beginnersbook.com/2017/08/cpp-oops-concepts/
Her skrives
Function overloading and Operator overloading are examples of polymorphism. Polymorphism is a feature using which an object behaves differently in different situation.
Og så gives eksemplet
Det er så dér jeg blev gnaven..
Forstår du, jeg bruger 'corona-tiden' til af børste støvet af en 20++ år gammel cpp 'stak' :p
Engang for læææænge siden havde jeg nok styr på cpp til at lave småspil i openGL så en del var på 'plads', dér (på pladsen) ligger nu ragelse og rust i et m tykt lag, men tror der stadig ligger lidt der kan 'bruges'
Men polyporfism det husker jeg som noget med overide fra metode kald, og ikke den her sære historie fra tutorial'en :)
Avatar billede arne_v Ekspert
29. marts 2020 - 17:48 #6
Den tutorial er ikke ret god.

Et eksempel med forskellig antal argumnenter er ikke polymorfisme.

Et eksempel med samme antal argumenter af forskellig type kan *måske* kaldes polymorphisme.

https://en.wikipedia.org/wiki/Polymorphism_(computer_science) kalder det for "adhoc polymprhism".

Men helt traditionel polymorphism er når du har et klasse hiraki og du kalder super klassens metoder og sub klasserne så har en forskellig implementering, men hvor man ikke behøver at tænke over den.
Avatar billede arne_v Ekspert
29. marts 2020 - 17:51 #7
Eksempel:

klassen Figure har en Move metode (pure virtual formentlig)
klasserne Square og Circle arver fra Figure og har en Move implementering

Figure *f1 = new Square();
Figure *f2 = new Circle();
f1->Move(10, 10);
f2->Move(10, 10);
Avatar billede prox1 Forsker
29. marts 2020 - 18:07 #8
Ja netop! Nej jeg studsede også iver hans 'polymorhism'
Tak for info!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester