abstrakte klassen (buch-beispiel) ich sehe da keinen sinn.
-
Hallo.
Ich habe mir mal das buch OOP für Dummies geholt.
und bin voll zufrieden damit.
aber bei einem beispiel sehe ich keinen sinn für die oberklasse.
ich poste mal den code:
type.h#ifndef _TYPE_H #define _TYPE_H #include <string> class Type { public: virtual const std::string getValue() = 0; }; class TypeInt : public Type { public: TypeInt(const int Value); virtual const std::string getValue(); private: int m_Int; }; class TypeFloat : public Type { public: TypeFloat(const int Value); virtual const std::string getValue(); private: float m_Float; }; class TypeString : public Type { public: TypeString(const std::string& Value); virtual const std::string getValue(); private: std::string m_String; }; #endif
type.cpp
#include "Type.h" #include <string> #include <sstream> using namespace std; TypeInt::TypeInt(const int Value) { m_Int = Value; } const std::string TypeInt::getValue() { stringstream sstream; sstream << m_Int; return sstream.str(); } TypeFloat::TypeFloat(const int Value) { m_Float = Value; } const std::string TypeFloat::getValue() { stringstream sstream; sstream << m_Float; return sstream.str(); } TypeString::TypeString(const std::string& Value) { m_String = Value; } const std::string TypeString::getValue() { return m_String; }
noswitch.cpp
#include <iostream> using namespace std; int main() { enum {ARRAY_MAX = 4}; Type* typeArray[ARRAY_MAX]; typeArray[0] = new TypeFloat(3.1415f); typeArray[1] = new TypeInt(5); typeArray[2] = new TypeString("Hallo Welt!"); typeArray[3] = new TypeInt(0); for (int i = 0; i < ARRAY_MAX; i++) { cout << i << " Inhalt: " << typeArray[i]->getValue() << endl; } for (int j = 0; j < ARRAY_MAX; j++) { delete typeArray[j]; } return 0; }
vielen dank.
-
und wo ist die Frage? was ist unklar? an welcher stelle hakts bei dir?
-
Hallo,
tja, ich versuchs mal:
Es gibt verschiedene Typen die du instanzieren kannst (int, float etc), die alle etwas gemeinsam haben: Die Methode getValue(). Du kannst aber keine Instanz von Typ erstellen, weil dieser eben abstrakt ist.Anderes Beispiel:
Ein Auto, ein Fahrrad und ein LKW sind Fahrzeuge, die instanziert werden können. Aber von der Klasse Fahrzeug kann eben kein Instanz erstellt werden (Ein Fahrzeug ist ein Oberbegriff für LKW, PKW und Fahrrad).Eine Dreieck, ein Kreis und ein Viereck sind Formen, die instanziert werden können. Aber von der Klasse Form kann eben kein Instanz erstellt werden (Eine Form ist ein Oberbegriff für Kreis, Dreieck und Viereck).
Abstrakte Klassen dienen also dazu, gemeinsame Methoden bereitzustellen. Da es aber keinen Sinn macht, diese zu instanzieren, sind sie eben abstrakt, wie die Beispiele (hoffentlich) verdeutlicht haben.
-
ok und jetzt kommentiere die base class im header aus.
zb. soclass TypeInt // : public Type
und versuche neu zu kompilieren dann siehst du wozu das ganze gut ist
K.
-
ZuK schrieb:
ok und jetzt kommentiere die base class im header aus.
zb. soclass TypeInt // : public Type
und versuche neu zu kompilieren dann siehst du wozu das ganze gut ist
K.hallo. ich habe es gemacht.
und siehe da es lässt sich nicht mehr kompilieren.
ich habe da ein anderes prog geschrieben.
eine klasse namens AFFE die rein virtual(funktion) ist
und dann noch 2 klassen eine FRAU und eine MANN die von AFFE abgeleitet ist.
(schlechtes beispiel)
und es kam folgende fehlermeldung:
can not connvert FRAU* to AFFE*
u.s.w
im buch steht was über Späte Bindung
trifft das hier zu?
Vielen Dank
-
Hallo,
ich glaube du hast es tatsächlich nicht verstanden. Affe, Mann und Frau ist in der Tat ein ganz schlechtes Beispiel. Da ist die Fehlermeldung das einzig Sinnvolle.
Mit später Bindung hat das nur insofern was zu tun, als dass die Methode virtual ist. Das bedeutet, dass erst zur Laufzeit entschieden wird, wozu sie gehört und was sie eigentlich macht. Aber das ist in dem Buch schon sehr gut erklärt.
Nur ist das unabhängig davon, ob die Klasse abstrakt ist oder nicht. Eine abstrake Klasse lässt sich eben nicht instanzieren, weil es dafür keine sinnvolle Verwendung gibt. Ein Affe ergäbe aber Sinn, weswegen das kein geeigneter Kandidat für eine abstrakte Klasse ist.
Ich bin nicht sicher ob meine Beispiel verständlich genug sind, aber evtl. solltest du dir diese nochmal angucken, damits etwas klarer wird.