私は次のクラスを持っています:
class Socket
{
Socket();
Socket( SOCKET s );
};
class Connection : public virtual Socket
{
Connection( IP ip );
};
これら 2 つのクラスには、いくつかの純粋仮想関数といくつかの非仮想関数、およびいくつかの独自のデータが含まれています。それらのポイントは、さまざまなプロトコルを実装して、いくつかのソケット タイプを派生させることです。
したがって、私は次の 2 つのクラスを専門としています。
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 ) {;}
};
何かがうまくいかない - あなたの多くが見ることができると確信しているように. ProtocolConnection を作成しようとしています:
new ProtocolConnection( s, ip );
構築は次のように進行します。
start ctor ProtocolConnection
start ctor Connection
start ctor Socket
Socket(); - default ctor via Connection's init list
end ctor Socket
Connection(); - default ctor ProtocolConnection's init list
end ctor Connection
start ctor ProtocolSocket
start ctor Socket
// Socket( s ); - skipped!!! - would have been from init
// list of ProtocolSocket, but ctor for this object
// already called!
end ctor Socket
ProtocolSocket( s ); -from init list of ProtocolConnection()
end ctor ProtocolSocket
ProtocolConnection( s, ip );
end ctor ProtocolConnection
その 2 番目の Socket コンストラクターをスキップすることは、言語仕様が行うべきことであり、正当な理由があります。
以前のものの代わりに、Socket( s ) が呼び出されたコンストラクターを呼び出すにはどうすればよいですか?
ProtocoSocket および ProtocolConnection オブジェクトと同じレベルで、OtherProtocolSocket および OtherProcolConnection などの複数の派生クラスを作成する予定です。
私が達成しようとしている効果は、ProtocolSocket および ProtocolConnection オブジェクトを構築し、それらを Socket および Connection オブジェクトとしてシステムに渡したいということです。したがって、特定のプロトコルを実装するソケットを作成した後は、基礎となるプロトコルの詳細を気にせずに、ソケットに読み書きするだけです。
Connection オブジェクトは、Socket オブジェクトからすべてのメソッドを継承する必要があります。
@アップデート:
DyP は、ProtocolConnection に Socket の初期化子を追加することを提案しています。これで問題は解決します。私はあなたにそれを受け入れたいと思います... しかし、それはただのコメントでした.