none
C++ Vererbung RRS feed

  • 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üße

    Anna

    Dienstag, 17. Juni 2014 13:55

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


    Dienstag, 17. Juni 2014 15:59

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


    Dienstag, 17. Juni 2014 15:59
  • Hallo,

    vielen dank für deine Antwort, funktioniert super! ;)

    Da hab ich ja einen ganz schön blöden Denkfehler gehabt!

    Liebe Grüße

    Anna

    Montag, 23. Juni 2014 06:41