C++ c++;具有指针的协变返回类型无效
我已经搜索了很多来找到我的问题的解决方案,但是我找不到让下面的代码正常工作的方法 背景 我编写了一个表示任何类型的归档的类结构(在我的实际情况中,这将是一个文件存储库,也可能是一个归档)。因此,我定义了一个表示存档的纯虚拟类结构 存档实际上是一个目录,目录实际上是一个实体(在本例中是基本的)。此存档中的文件也将是一个实体(基本)。这些类被用作实际实现的接口 在代码中,您将看到我的。。。这些类的实现 问题 MyDirectory实现覆盖基的getParent方法,该方法期望返回一个目录。实际上,MyDirectory实现只能将MyDirectory作为父级,因此新实现返回的是MyDirectory,而不是目录。这就是C++抛出错误信息的地方! 编译器不知道MyDirectory实际上是一个目录,因为我在声明MyDirectory类之前覆盖了MyBase类中的getParent方法 由于MyDirectory还希望调用特定的MyDirectory方法(如getAbsolutePath),因此我需要返回类型为MyDirectory,而不是Directory。(静态_cast也不起作用:() 我很乐意听到任何提示,如何解决我的问题:) 编辑:详细信息C++ c++;具有指针的协变返回类型无效,c++,oop,g++,C++,Oop,G++,我已经搜索了很多来找到我的问题的解决方案,但是我找不到让下面的代码正常工作的方法 背景 我编写了一个表示任何类型的归档的类结构(在我的实际情况中,这将是一个文件存储库,也可能是一个归档)。因此,我定义了一个表示存档的纯虚拟类结构 存档实际上是一个目录,目录实际上是一个实体(在本例中是基本的)。此存档中的文件也将是一个实体(基本)。这些类被用作实际实现的接口 在代码中,您将看到我的。。。这些类的实现 问题 MyDirectory实现覆盖基的getParent方法,该方法期望返回一个目录。实际上,M
问题实际上是复杂的继承图。问题是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
如果这使得代码维护起来很麻烦,那么编写一个免费函数calpedGetParent
,它使用覆盖选择要调用的函数。如果您不喜欢自由函数,请添加一个非虚拟方法来选择要调用的函数(两个,一个在Base
中,一个在MyBase
中)
自由函数/非虚方法的唯一问题是,您的多路径树可能会混淆它,从而导致歧义。当您知道有一个
MyBase
并且需要一个MyDirectory*
时,我只需要调用GetMyParent()
。对方法/自由函数的大量重写的要求,或使ti自动发生所需的模板黑客攻击,都是不值得的。协变返回类型只是方便而已
编写GetMyParent()
返回MyDirectory
。推迟GetParent
和GeyMyParent
的实现,直到MyDirectory
可见,然后让GetParent
调用GetMyParent
在MyDirectory
中,如果您愿意,可以使GetParent
完全共变,但我不想麻烦。决不要在MyBase
之后重写GetParent
,如果需要,请重写GetMyParent
可能将GetParent
设为私有,这样您就不会意外地调用它。如果您有一个MyBase
,请改为调用GeyMyParent
如果这使得代码维护起来很麻烦,那么编写一个免费函数calpedGetParent
,它使用覆盖选择要调用的函数。如果您不喜欢自由函数,请添加一个非虚拟方法来选择要调用的函数(两个,一个在Base
中,一个在MyBase
中)
自由函数/非虚方法的唯一问题是,您的多路径树可能会混淆它,从而导致歧义。当您知道有一个MyBase
并且需要一个MyDirectory*
时,我只需要调用GetMyParent()
。对方法/自由函数或模板的大量重写的要求