Benutzer mit den meisten Antworten
C++ Vererbung

Frage
-
Hallo Leute,
ich hab ein riesen Problem mit der Vererbung in C++. In Google habe ich zu dem Problem, wie ich es habe, leider nichts gefunden und hoffe, dass ihr mir helfen könnt!
Es gibt Gründe, warum ich nachfolgenden Code nicht ändern kann, und verstehe nicht, wie ich die Vererbung damit handhaben soll!
In der Main-Klasse wird folgendes aufgerufen:Arinc429Interface obj(8, 8, 0); obj.RegisterTxLabel(1, 050, 10);
Arinc429Interface ist eine Klasse, im Konstruktor werden drei Statusvariablen initialisiert!
Da ich zwei verschiedene Arinc429Interfaces brauche, wollte ich eine Hauptklasse (Arinc429Interface) erstellen und davon zwei Klassen ableiten (ArincAIM429Interface & ArincMy429Interface).Die Methode "RegisterTxLabel" wird dann in den beiden Unterklassen entsprechend überschrieben.
Mein Problem ist nun aber, bei dem Aufruf
Arinc429Interface obj(8, 8, 0);
soll die 0 aussagen, dass ich die Unterklasse ArincAIM429Interface verwenden will!
Wie sage ich nun innerhalb des Konstruktors der Hauptklasse, welche Unterklasse verwendet werden soll?
Die Hauptklasse weiß ja nichts von den Unterklassen also kann ich nicht deren Konstuktor aufrufen!
Da ich mich von haus aus noch etwas schwer mit Vererbung tue, hoffe ich, dass ihr mir weiterhelfen könnt! ;)
Liebe GrüßeAnna
Antworten
-
Hallo,
so funktioniert das nicht. Die einzige Möglichkeit besteht darin in jeder der Unterklassen einen eigenen Konstruktor zu definieren. Bei diesem kannst du dann den 3. Parameter weg lassen. Der Konstruktor kann das den Basisklassenkonstruktor aufrufen und die 0 als 3. Parameter übergeben.Ich habe mal versucht ein Beispiel in C++ (mit nativen Klassen) zusammen zu bekommen, allerdings kann ich die Sprache nicht mehr all zu gut (Kompilieren funktioniert).
#include "stdafx.h" #include <conio.h> class BaseClass{ public: int Value1; int Value2; int ClassType; BaseClass(int val1, int val2, int classType){ this->Value1 = val1; this->Value2 = val2; this->ClassType = classType; } }; class ClassA : public BaseClass{ public: //Basiskalssenkonstruktor aufrufen und Werte übergeben ClassA(int val1, int val2) :BaseClass(val1, val2, 0){ } }; class ClassB : public BaseClass{ public: //Basiskalssenkonstruktor aufrufen und Werte übergeben ClassB(int val1, int val2) :BaseClass(val1, val2, 1){ } }; int _tmain(int argc, _TCHAR* argv[]) { ClassA ciA(0, 1); ClassB ciB(0, 2); printf("ciA.ClassType= %d\nciB.ClassType= %d", ciA.ClassType, ciB.ClassType); _getch(); return 0; }
Ausgabe:
Dem Basisklassenkonstruktor wird je der spezische Wert der Kind-Klasse übergeben.
Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Bearbeitet Tom Lambert (Koopakiller) Dienstag, 17. Juni 2014 16:12
- Als Antwort vorgeschlagen Tom Lambert (Koopakiller) Montag, 23. Juni 2014 14:06
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 10. Oktober 2014 12:44
Alle Antworten
-
Hallo,
so funktioniert das nicht. Die einzige Möglichkeit besteht darin in jeder der Unterklassen einen eigenen Konstruktor zu definieren. Bei diesem kannst du dann den 3. Parameter weg lassen. Der Konstruktor kann das den Basisklassenkonstruktor aufrufen und die 0 als 3. Parameter übergeben.Ich habe mal versucht ein Beispiel in C++ (mit nativen Klassen) zusammen zu bekommen, allerdings kann ich die Sprache nicht mehr all zu gut (Kompilieren funktioniert).
#include "stdafx.h" #include <conio.h> class BaseClass{ public: int Value1; int Value2; int ClassType; BaseClass(int val1, int val2, int classType){ this->Value1 = val1; this->Value2 = val2; this->ClassType = classType; } }; class ClassA : public BaseClass{ public: //Basiskalssenkonstruktor aufrufen und Werte übergeben ClassA(int val1, int val2) :BaseClass(val1, val2, 0){ } }; class ClassB : public BaseClass{ public: //Basiskalssenkonstruktor aufrufen und Werte übergeben ClassB(int val1, int val2) :BaseClass(val1, val2, 1){ } }; int _tmain(int argc, _TCHAR* argv[]) { ClassA ciA(0, 1); ClassB ciB(0, 2); printf("ciA.ClassType= %d\nciB.ClassType= %d", ciA.ClassType, ciB.ClassType); _getch(); return 0; }
Ausgabe:
Dem Basisklassenkonstruktor wird je der spezische Wert der Kind-Klasse übergeben.
Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Bearbeitet Tom Lambert (Koopakiller) Dienstag, 17. Juni 2014 16:12
- Als Antwort vorgeschlagen Tom Lambert (Koopakiller) Montag, 23. Juni 2014 14:06
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 10. Oktober 2014 12:44