構築中に固定される方向とサイズの 2 つのプロパティを持つクラス Channel があります。方向は、前方 (1) または後方 (-1) の 2 つの値のいずれかを取ることができます。サイズは任意の値を取ることができますが、0 とゼロ以外の値の間には物理的に意味のある違いがあります。
方向やサイズの既知の値を持つ Channel オブジェクトを受け入れる関数を記述できるようにしたいと考えており、派生クラスを使用してこれを実装することを考えました。
Channel
|
-----------------------------------------------
| | | |
ForwardChannel BackwardChannel ZeroChannel NonzeroChannel
| | | |
| ---------------- ...
| | |
| BackwardZeroChannel |
| |
---------------------------------
|
ForwardZeroChannel
明らかに、すべての順列を描いたわけではありません。
そのまま実装してみた
class Channel {
Channel(int direction, int size) { ... };
...
}
class ForwardChannel: public virtual Channel {
ForwardChannel(int size) : Channel(1, size) { ... }
...
}
class ZeroChannel: public virtual Channel {
ZeroChannel(int direction) : Channel(direction, 0) { ... }
...
}
class ForwardZeroChannel: public ForwardChannel, ZeroChannel {
ForwardZeroChannel() : ForwardChannel(0), ZeroChannel(1)
...
}
ForwardChannel と ZeroChannel のインスタンス化は正常に機能します。ForwardZeroChannel をインスタンス化すると、値を設定しない Channel のデフォルト コンストラクターのみが呼び出されます。Channel(1, 0) を初期化リストに追加する必要があります。
class ForwardZeroChannel: public ForwardChannel, ZeroChannel {
ForwardZeroChannel() : Channel(0, 1), ForwardChannel(0), ZeroChannel(1)
...
}
しかし、それは ForwardChannel と ZeroChannel から派生する目的の一部を無効にしているようです。これを行うより良い方法はありますか?