Ich habe die folgenden Klassen:
class Socket
{
Socket();
Socket( SOCKET s );
};
class Connection : public virtual Socket
{
Connection( IP ip );
};
Diese beiden Klassen enthalten einige rein virtuelle Funktionen und einige nicht virtuelle Funktionen und einige eigene Daten. Der Sinn dahinter ist, dass ich einige Socket-Typen ableite, die verschiedene Protokolle implementieren.
Also spezialisiere ich auf diese beiden Klassen:
class ProtocolSocket : public virtual Socket
{
ProtocolSocket() {}
ProtocolSocket( SOCKET s ) : Socket( s ) { ; }
};
class ProtocolConnection : public ProtocolSocket, public virtual Connection
{
ProtocolConnection( SOCKET s, IP ip ) : ProtocolSocket( s ), Connection( ip ) {;}
};
Etwas geht schief - wie sicher viele von Ihnen sehen können. Ich versuche, eine ProtocolConnection zu erstellen:
new ProtocolConnection( s, ip );
Der Aufbau erfolgt wie folgt:
start ctor ProtocolConnection
start ctor Connection
start ctor Socket
Socket(); - Standard ctor über die Init-Liste von Connection
end ctor Socket
Connection(); - Standard ctor der Init-Liste von ProtocolConnection
end ctor Connection
start ctor ProtocolSocket
start ctor Socket
// Socket( s ); - übersprungen!!! - hätte von der Init-Liste von ProtocolSocket kommen sollen, aber der Konstruktor für dieses Objekt wurde bereits aufgerufen!
end ctor Socket
ProtocolSocket( s ); - von der Init-Liste von ProtocolConnection()
end ctor ProtocolSocket
ProtocolConnection( s, ip );
end ctor ProtocolConnection
Das Überspringen dieses zweiten Socket-Konstruktors ist das, was die Sprachspezifikation besagt, dass es passieren soll, und zwar aus guten Gründen.
Wie rufe ich den Konstruktor mit Socket( s ) auf, anstatt den früheren?
Ich beabsichtige, mehrere abgeleitete Klassen z.B. Auch OtherProtocolSocket und OtherProcolConnection, auf derselben Ebene wie ProtocoSocket und ProtocolConnection-Objekte zu haben.
Der Effekt, den ich zu erzielen versuche, ist, dass ich ProtocolSocket- und ProtocolConnection-Objekte erstelle und dann als Socket- und Connection-Objekte in meinem System übergebe. Nachdem ich also ein Socket erstellt habe, das ein bestimmtes Protokoll implementiert, lese und schreibe ich einfach darauf, ohne mich um die Details des zugrunde liegenden Protokolls kümmern zu müssen.
Connection-Objekte müssen alle Methoden von Socket-Objekten erben.
@UPDATE:
DyP schlägt vor, einen Initialisierer für Socket in ProtocolConnection hinzuzufügen. Das löst das Problem. Ich würde Ihnen dafür eine Akzeptanz geben... aber es war nur in einem Kommentar.