C++ c++;具有指针的协变返回类型无效

C++ c++;具有指针的协变返回类型无效,c++,oop,g++,C++,Oop,G++,我已经搜索了很多来找到我的问题的解决方案,但是我找不到让下面的代码正常工作的方法 背景 我编写了一个表示任何类型的归档的类结构(在我的实际情况中,这将是一个文件存储库,也可能是一个归档)。因此,我定义了一个表示存档的纯虚拟类结构 存档实际上是一个目录,目录实际上是一个实体(在本例中是基本的)。此存档中的文件也将是一个实体(基本)。这些类被用作实际实现的接口 在代码中,您将看到我的。。。这些类的实现 问题 MyDirectory实现覆盖基的getParent方法,该方法期望返回一个目录。实际上,M

我已经搜索了很多来找到我的问题的解决方案,但是我找不到让下面的代码正常工作的方法

背景

我编写了一个表示任何类型的归档的类结构(在我的实际情况中,这将是一个文件存储库,也可能是一个归档)。因此,我定义了一个表示存档的纯虚拟类结构

存档实际上是一个目录,目录实际上是一个实体(在本例中是基本的)。此存档中的文件也将是一个实体(基本)。这些类被用作实际实现的接口

在代码中,您将看到我的。。。这些类的实现

问题

MyDirectory实现覆盖基的getParent方法,该方法期望返回一个目录。实际上,MyDirectory实现只能将MyDirectory作为父级,因此新实现返回的是MyDirectory,而不是目录。这就是C++抛出错误信息的地方! 编译器不知道MyDirectory实际上是一个目录,因为我在声明MyDirectory类之前覆盖了MyBase类中的getParent方法

由于MyDirectory还希望调用特定的MyDirectory方法(如getAbsolutePath),因此我需要返回类型为MyDirectory,而不是Directory。(静态_cast也不起作用:()

我很乐意听到任何提示,如何解决我的问题:)

编辑:详细信息


问题实际上是复杂的继承图。问题是MyDirectory继承MyBase,但是MyBase的方法返回MyDirectory——但是基类需要返回一个目录,但是在声明时,C++不知道MyDirectory实际上是一个目录。我试图解决的问题是,MyDirectory可以返回MyDirectory实例,而不需要返回目录实例

//只是一个示例代码-实际上在.h和.cpp中分开,在cleaner和…:)
类目录;
类目录;
阶级基础{
公众:
///返回父目录
虚拟目录*getParent()=0;
};
类目录:虚拟公共基{
公众:
};
类存档:虚拟公共目录{
公众:
};
// ---------------------------------
类MyBase:虚拟公共基{
公众:
///建造师
MyBase(inti,intj,intk){}
///返回父目录
MyDirectory*getParent(){return NULL;}
///返回父目录
虚拟常量char*getAbsolutePath()常量{返回“我的完整路径”;}
};
类MyDirectory:虚拟公共目录,公共MyBase{
公众:
///建造师
MyDirectory(inti,intj):MyBase(i,j,i+j){}
///返回父目录(不是真的,我知道!只是一个示例)
虚拟常量char*getAbsolutePath()常量{return getParent()->getAbsolutePath();}
};
类MyArchive:虚拟公共归档,公共MyDirectory{
公众:
///建造师
MyArchive(inti):MyDirectory(i,i){}
};

协变返回类型非常方便

编写
GetMyParent()
返回
MyDirectory
。推迟
GetParent
GeyMyParent
的实现,直到
MyDirectory
可见,然后让
GetParent
调用
GetMyParent

MyDirectory
中,如果您愿意,可以使
GetParent
完全共变,但我不想麻烦。决不要在
MyBase
之后重写
GetParent
,如果需要,请重写
GetMyParent

可能将
GetParent
设为私有,这样您就不会意外地调用它。如果您有一个
MyBase
,请改为调用
GeyMyParent

如果这使得代码维护起来很麻烦,那么编写一个免费函数calped
GetParent
,它使用覆盖选择要调用的函数。如果您不喜欢自由函数,请添加一个非虚拟方法来选择要调用的函数(两个,一个在
Base
中,一个在
MyBase
中)


自由函数/非虚方法的唯一问题是,您的多路径树可能会混淆它,从而导致歧义。当您知道有一个
MyBase
并且需要一个
MyDirectory*
时,我只需要调用
GetMyParent()
。对方法/自由函数的大量重写的要求,或使ti自动发生所需的模板黑客攻击,都是不值得的。

协变返回类型只是方便而已

编写
GetMyParent()
返回
MyDirectory
。推迟
GetParent
GeyMyParent
的实现,直到
MyDirectory
可见,然后让
GetParent
调用
GetMyParent

MyDirectory
中,如果您愿意,可以使
GetParent
完全共变,但我不想麻烦。决不要在
MyBase
之后重写
GetParent
,如果需要,请重写
GetMyParent

可能将
GetParent
设为私有,这样您就不会意外地调用它。如果您有一个
MyBase
,请改为调用
GeyMyParent

如果这使得代码维护起来很麻烦,那么编写一个免费函数calped
GetParent
,它使用覆盖选择要调用的函数。如果您不喜欢自由函数,请添加一个非虚拟方法来选择要调用的函数(两个,一个在
Base
中,一个在
MyBase
中)

自由函数/非虚方法的唯一问题是,您的多路径树可能会混淆它,从而导致歧义。当您知道有一个
MyBase
并且需要一个
MyDirectory*
时,我只需要调用
GetMyParent()
。对方法/自由函数或模板的大量重写的要求