Vererbungs Problem

Topinator

Grünschnabel
Hi

Ich habe 3 Klassen:

Code:
class A 
{
   virtual public test {}
   virtual public test1 {}
}
class B : public A 
{
   public test {/*tue dies*/}
   public test1 {}
}
class C: public B 
{
  public test {/*tue das*/}
}

In Klasse A gibt es virtuelle Methoden die in Klasse B ordentlich implementiert worden sind, nur in Klasse C ist die funktion test anders als in Klasse B.

Ich will jetzt aus Klasse C den Konstruktor von Klasse B aufrufen, der wiederherum den Konstruktor von Klasse A aufruft. In Klasse A wird eine Datei geöffnet und ausgelesen, dann die virtuellen Funktionen aufgerufen. Allerdings werden nur die Funktionen von Klasse B benutzt nicht die test Funktion von Klasse C. Im Konstruktor von Klasse B wird noch etwas mit den Daten gemacht bevor der Konstruktor von Klasse C weiterarbeiten soll.

Ist das irgendwie möglich?
 
Zuletzt bearbeitet:
Hi.
Ich will jetzt aus Klasse C den Konstruktor von Klasse B aufrufen, der wiederherum den Konstruktor von Klasse A aufruft. In Klasse A wird eine Datei geöffnet und ausgelesen, dann die virtuellen Funktionen aufgerufen. Allerdings werden nur die Funktionen von Klasse B benutzt nicht die test Funktion von Klasse C. Im Konstruktor von Klasse B wird noch etwas mit den Daten gemacht bevor der Konstruktor von Klasse C weiterarbeiten soll.

Ist das irgendwie möglich?
Deine Beschreibung ist nicht sehr eindeutig. Statt deinen Code nur (unzureichend) zu beschreiben poste die relevanten Teile einfach hier rein.

Natürlich kann man einen Konstruktor nicht direkt "aufrufen" außer im Konstruktor einer abgeleiteten Klasse.

Gruß
 
Nagut ich versuche es besser zu beschreiben, den richtigen Code zu posten würde den Rahmen sprengen.

Code:
class A 
{
   string file;
   A(string) {file = stirng;}
   void open() {/* liest Datei, ruft test oder test1 auf */}
   virtual public test(string) {}
   virtual public test1(string) {}
}
class B : public A 
{
   B(string) : A(string) {/* this->open; macht noch mehr */}
   public test(string) {/*tue dies*/}
   public test1(string) {}
}
class C: public B 
{
  C(string) : B(string) {/* macht auch was mit den Daten nach dem auslesen */}
  public test(string) {/*tue das*/}
}

So ich erzeuge mir ein Objekt der Klasse C übergebe ihr im Konstruktur den Dateinamen.
Nun soll durch den Konstruktoraufruf von B die Datei geöffnet und ausgewertet werden.
Nur soll dazu die test Funktion aus C aufgerufen werden und nicht die aus B, aber test1 soll aus B aufgerufen werden.
 
So ich erzeuge mir ein Objekt der Klasse C übergebe ihr im Konstruktur den Dateinamen.
Nun soll durch den Konstruktoraufruf von B die Datei geöffnet und ausgewertet werden.
Nur soll dazu die test Funktion aus C aufgerufen werden und nicht die aus B, aber test1 soll aus B aufgerufen werden.
Du kannst in der Klasse B nur Methoden der Klasse und alle zugreifbaren Methoden der Basisklasse von B aufrufen.

Du kannst Polymorphie (also die virtuellen Methoden) eigentlich nur mit Referenzen und Zeigern verwenden. Im Konstruktor hast du ja noch nicht mal ein fertiges Objekt.

Warum machst du das denn alles im Konstruktor? Da solltest du evtl. dein Design nochmal überarbeiten.

Gruß
 
gibts ne möglichkeit das ich Klasse C von Klasse B und Klasse A erben lasse und dann im Konstruktor von C alles mache?
Ja, das könntest du machen. Aber warum? Du verbiegst die Vererbungsstruktur weil sie nicht mit deiner Codestruktur übereinstimmt?

Evtl. solltest du dir mal das Fabrikmethode Entwurfsmuster anschauen. Konkret kann man dazu allerdings nichts sagen, da die Informationen zu spärlich sind.

Gruß
 
Hi

Ich habe das mit der Vererbung mir nicht ausgesucht, die Klasse A die die Datei ausliest liegt mir nur so vor.

Die Klasse B stellt ein "Polygonales Netz" dar und die Klasse C soll ein "Trianguliertes Polygonales Netz" sein. Allerdings will ich das Polygonale Netz direkt beim Auslesen triangulieren und nicht es erst komplett einlesen und dann triangulieren.

Ich habe nun Klasse B und Klasse C von Klasse A erben lassen (bei erben virtuell Klasse A),
leider müssen dem Konstruktor von Klasse A, B und C der Dateiname übergeben werden, was zu dem Problem führt das ich beim initialisieren von Klasse C automatisch Klasse B mit initialisieren muss. Ich habe das jetzt erstmal mit nem workaround gemacht das Klasse B in ihrem Konstruktor nichts macht wenn ein leerer string übergeben wird. Aber das gefällt mir noch nicht so gut. Einen Standartkonstruktor will ich auch nicht einführen da dass zu noch mehr unnötigen code führt.

Gibt es dafür irgendwie ne Möglichkeit das umzusetzen.
 
Zurück