TCPClientはソケットを使用するか、ソケットを持っていますが、それ自体はソケットではありません。通常、ソケットが期待される場所でTCPClientを置き換えることができるとは期待していません。そのため、公的継承は意味がありません。
この場合、プライベート継承を使用できますが、(少なくとも一般的なケースでは)おそらくあまり意味がありません。プライベート継承は、主に、基本クラスが子クラスでオーバーライドする予定の仮想関数を少なくとも1つ提供する場合に意味があります。仮想関数があり、それをオーバーライドする必要がある場合は、継承を使用する以外に実際の選択肢はありません。ただし、Socketクラスに仮想関数があるとは思いません。通常、ここでは適用されません。
これは基本的に2番目の解決策につながります。TCPClientには、継承を使用するのではなく、Socketのインスタンスを含める必要があります。
ただし、ここで示したSocket
クラスは、実際のソケットの概念とアドレスの概念を混同しているように見えることを付け加えておきます。私の最初のソケットクラス(数年前)はそのように機能しましたが、それ以来、それは実際には理想的な設計ではないと結論付けました。アドレスの概念をソケット自体から分離しておくことは価値があると私は確信しました。私の場合は少し複雑ではありませんが、私が思いついたのは、BoostASIOが派生したプロトタイプである可能性がほとんどあるように見えるのは興味深いことです。少し小さくてシンプルですが、基本的な考え方の多くは、とにかく一般的にかなり似ています。
それが私の次の推奨事項につながります。BoostASIOを見てください。それ以外のことをするかなり具体的な理由がないので、それは私がほとんどの新しいコードでアドバイスする(そして一般的に使用する)ものです。(私が上で言ったように)私は何年にもわたっていくつかのソケットクラスを書いてきましたが、私はかなり長い間(何か?)新しいコードでそれらのどれも使用していません-それらは実際にはASIOに対して2つの可能な利点しかありません。最初のものは私だけに当てはまります。ASIOが存在する前にそれらを作成して使用したので、私はすでにそれらとそれらがどのように機能するかを理解しています。2番目は似ているかもしれません:少なくとも私には、それらは少し小さくて単純に見えます(しかし、繰り返しますが、それは私が最初にそれらを使用したという理由だけかもしれません)。それでも、(たとえば)他の人がすでに理解しているものを使用することの利点は、それらを非常に簡単に打ち負かします。