Überladung einer virtuellen Funktion, Mehrfachvererbung - C++

Ich habe 2 Klassen, TNetzKomponente und TKabel. Das Kabel erbt von TNetzKomponente, welche gekürzt so aussieht:
Code:
class TNetzKomponente
{
     protected:
          virtual void SetPlanPos(TKoordinate PlanPos);

     public:
          virtual void BewegeAnschluss(TNetzKomponente *Komponente, TKoordinate NeuePos);
};
void TNetzKomponente::SetPlanPos(TKoordinate PlanPos)
{
          TNetzKomponente *KabelZuBewegen;

          ...

          KabelZuBewegen->BewegeAnschluss(this,AnschlussPos);

          ...
}
void TNetzKomponente::BewegeAnschluss(TNetzKomponente *Komponente, TKoordinate NeuePos)
{
          //ist wirklich leer
}
TKabel:
Code:
class TKabel : public TNetzKomponente
{
     public:
          virtual void BewegeAnschluss(TNetzKomponente *Komponente, TKoordinate NeuePos);

};
void TKabel::BewegeAnschluss(TNetzKomponente *Komponente, TKoordinate NeuePos)
{
          //diesmal tatsächlich mit Inhalt
}
Dem Zeiger KabelZuBewegen wurde Speicher für ein TKabel zugewiesen (erkennbar daran, dass boolscher Member false ist, welcher bei allen anderen Typen true ist).
Mein Problem ist, dass mit der momentanen Variante im Codeblock 1 in Zeile 15 immer die Fehlermeldung aus dem Anhang erscheint.
Sobald ich aber die Zeile so ändere:
Code:
 KabelZuBewegen->TNetzKomponente::BewegeAnschluss(this,AnschlussPos);
Sind alle Fehlermeldung vom Tisch, nur wird halt nicht das erwünschte durchgeführt (logischerweise).

Ich verwende den Borland C++ Builder 6.
Falls noch mehr Infos nötig sind stelle ich sie natürlich gerne bereit, aber ich wollte das gesamte Listing jetzt niemandem antun.

mfg benediktibk
 
ich glaube nicht dass das etwas mit der virtuellen funktion zu tun hat, dass sieht nach einem shlichten fehle rmit der speichernalegung aus. Du sagtest dass dem Pointer Speicher für ein TKabel zugewiesen wurde, schreibst aber TNetzKomponente im Code, warum deklarierst du nicht gleich mit dem richtigen typ? ich könnte mir noch vorstellen dass das this probleme macht, falls du die funktion extern aufrufst, ich kenne ja de vollständigen code nicht.
 
Original von LionC
Du sagtest dass dem Pointer Speicher für ein TKabel zugewiesen wurde, schreibst aber TNetzKomponente im Code, warum deklarierst du nicht gleich mit dem richtigen typ?
Geht leider nicht, weil TKabel von TNetzKomponente erbt.

Das Problem war aber die Adresse des Kabels. Bei der Suche nach dem Ursprung des Problems bin ich jetzt auf etwas gestoßen, was mich sehr stutzig gemacht hat.
Code:
VerbindungHerstellen(TNetzKomponenteElektrisch *NetzKomponente1, bool Eingang1, unsigned int Anschluss1, TNetzKomponenteElektrisch *NetzKomponente2, bool Eingang2, unsigned int Anschluss2)
Diese Funktion sorgt dafür, dass die Adressen übernommen werden. Beim Debuggen ist mir aufgefallen, dass die übergebenen Zeiger andere Werte als die dann in der Funktion haben.
Parameter (außerhalb der Funktion):
Code:
NeuesKabel: 9986896
Auswahl: 9983932
Code:
VerbindungHerstellen((TNetzKomponenteElektrisch*)(TKabelElektrisch*)NeuesKabel,false,0,Auswahl,Eingang,AnschlussNummer)
Parameter (innerhalb der Funktion):
Code:
NetzKomponente1: 9987040
NetzKomponente2: 9983932
Die fehlenden 144 Byte entsprechen genau der Größe eines TKabels, weshalb ich mir jetzt auf die schnelle eine etwas dreckigen Workaround gebastelt habe :D:
Code:
NetzKomponente1 = (TNetzKomponenteElektrisch*)((BYTE*)NetzKomponente1 - 144);
Und siehe da: Es funktioniert!

Jetzt frage ich mich nur noch wo die paar Bytes auf einmal her kommen.
Zum besseren Verständnis im Anhang noch die Vererbungshierarchie.
Habe ich es da mit einem Diamond-Problem zu tun?

mfg benediktibk

Edit: Bild sieht komisch aus bei mir, deswegen für alle Fälle noch einmal.
a00133.png


Edit2: Ja, es war das Diamond-Problem, und die Lösung dafür war, dass ich TNetzKomponente und TKabelElektrisch virtual erben lassen habe. Beispiel folgt sogleich:
Code:
class A
{
	private:
		int typ;
	public:
		int GetTyp()
		{
			return typ;
		}
		A()
		{
			printf("Konstruktor A\n");
		}
		virtual ~A()
		{
			printf("Destruktor A\n");
		}
};

class B : public virtual A
{
	public:
		B()
		{
			printf("Konstruktor B\n");
		}
		virtual ~B()
		{
			printf("Destruktor B\n");
		}
};

class C: public virtual A
{
	public:
		C()
		{
			printf("Konstruktor C\n");
		}
		virtual ~C()
		{
			printf("Destruktor C\n");
		}
};

class D: public B, public C
{
	public:
		D()
		{
			printf("Konstruktor D\n");
		}
		virtual ~D()
		{
			printf("Destruktor D\n");
		}
};
 
Zurück
Oben