次の継承階層を使用して、C++ で「ファイルシステム」の抽象化を作成しています。
[Node]
^
|
+----[Dir]
|
+----[File]
whereNode
は両方と同じすべての動作を定義します (名前、最終更新時刻など)。ただし、type を返すNode
メソッドが呼び出されています。の実装仕様を明らかに知る必要がありますが、何が入っているかを知る必要がないため、前方宣言を使用できるため、これはうまく機能します。偉大な。getParent()
Dir *
Dir.h
Node.h
Node.h
Dir.h
しかし、最近、特定の時点でのファイルシステムの「スナップショット」をサポートできるように、複数の継承を追加することにしました。これらは「ライブ」Node
File
およびDir
クラスの読み取り専用バージョンであり、ライブ バージョンは書き込みだけでなく読み取りもできるため、各ライブ バージョンはスナップショット デュアルから継承します。
[NodeSnapshot] <------ [Node]
^ ^
| |
+---[DirSnapshot]<---+---[Dir]
| |
+---[FileSnapshot]<--+---[File]
したがって、は と のDir
両方から継承し、 は と のNode
両方から継承します。の宣言に到達するまで、これまでのところすべてが順調に見えます。では、 を返します。問題ありません。再度前方宣言を使用できます。しかし、で、私は戻りたいです。私はプログラマとして、が のサブタイプであることを知っていますが、前方宣言にはこの有用な情報が埋め込まれていないため、コンパイラはこれを知る方法がありません。DirSnapshot
File
FileSnapshot
Node
getParent()
NodeSnapshot
DirSnapshot *
Node
Dir *
Dir
DirSnapshot
この前方宣言がサブクラスであることをコンパイラに通知することは可能ですか?したがって、 の戻り値の型が の戻り値の型とDir::getParent()
共変しないことを教えてはいけませんDirSnapshot::getParent()
か?