我正在用 C++ 编写一个“文件系统”抽象,具有以下继承层次结构:
[Node]
^
|
+----[Dir]
|
+----[File]
WhereNode
定义了与两者相同的所有行为(名称、上次修改时间等),但是,我有一个Node
称为getParent()
返回 type的方法Dir *
。这很好用,因为虽然Dir.h
显然需要知道 中的实现规范Node.h
,Node.h
但不需要知道其中的内容,Dir.h
所以我可以使用前向声明。伟大的。
但是,我最近决定添加多重继承,这样我就可以在某个时间支持文件系统的“快照”。这些是“实时”Node
File
和Dir
类的只读版本,并且由于实时版本可以读取和写入,我让每个实时版本都从其快照对偶继承:
[NodeSnapshot] <------ [Node]
^ ^
| |
+---[DirSnapshot]<---+---[Dir]
| |
+---[FileSnapshot]<--+---[File]
因此,Dir
继承自两个Node
and DirSnapshot
,并且File
继承自两个FileSnapshot
and Node
。到目前为止,一切看起来都不错,直到我们得到getParent()
. 在NodeSnapshot
中,我返回一个DirSnapshot *
. 没问题,我可以再次使用前向声明。但是,在Node
,我想返回Dir *
。作为程序员,我知道这Dir
是 的子类型DirSnapshot
,但是编译器无法知道这一点,因为前向声明中没有嵌入任何有用的信息。
是否可以通知编译器这个前向声明是一个子类,因此它不应该告诉我 of 的返回类型与 of 的返回类型Dir::getParent()
不同DirSnapshot::getParent()
?