>>154163 >Schon klar, Polymorphismus zur Laufzeit braucht man eigentlich gar nicht.
Tatsächlich braucht man den Polymorphismus nicht in der Ausprägung, der man in C++ begegnet. Wie schon oben geschrieben:
*Man nimmt mehrere Arrays
*Man nimmt ein switch
*Verbleibender, extrem seltener Fall: Man hat externe Programmierer bei Drittanbietern außerhalb der Organisationseinheit, die die aufzurufenden Funktionen schreiben, die zur Kompilierzeit noch gar nicht bekannt sind, Plugin-System-Style. Da braucht man Zeiger-Array und Virtuelle-Funktionszeiger-Tabellen.
*Verbleibender, noch extrem seltenerer Fall: Man muss auch die Anzahl der Methoden zur Laufzeit dynamisch halten. Geht mit OOP garnicht, hat C bereits bei Dateisystemen vor Äonen gelöst.
>C++
Ist tatsächlich für einen Vergleich zwischen OOP und Nicht-OOP sehr brauchbar, da man im Vergleich zu einigen anderen Sprachen die Wahl hat, ob man die OOP-ismen benutzt.
>Was Arrays mit Vererbung zu tun haben, bleibt auch dein Geheimnis.
#include <stdio.h>
struct Base
{
int member1;
};
struct Derived1 : public Base
{
int member2;
int member3;
};
int diff1(Base * arr, size_t n)
{
int result = 0;
for(size_t i = 0; i < n - 1; i++)
result += arr[i+1].member1 - arr[i].member1;
return result;
}
int diff2(Derived1 * arr, size_t n)
{
int result = 0;
for(size_t i = 0; i < n - 1; i++)
result += arr[i+1].member1 - arr[i].member1;
return result;
}
int main(int /*argc*/, char ** /*argv*/)
{
Derived1 arr[8];
for(size_t i = 0; i < 8; i++)
{
arr[i].member1 = 1;
arr[i].member2 = 5;
arr[i].member3 = 1337;
}
printf("%d\n", diff1(arr, 8));
printf("%d\n", diff2(arr, 8));
return 0;
}
Die Felixe dürfen mal die Ausgabe raten (ja, dort steht
member1
minus
member1
).
Dort ist noch nicht einmal ein Typ-Cast im Kot drin, Warnungen gibt es auch mit -Wall -Wextra -Wpedantic keine.
Dahinter steckt aber ein grundlegendes, von C++ vollkommen unabhängiges Problem.