C++ c++;:继承具有不同(但协变)返回类型的方法

C++ c++;:继承具有不同(但协变)返回类型的方法,c++,inheritance,covariance,return-type,C++,Inheritance,Covariance,Return Type,假设我们有两个类: 类数据结构{ 公众: 数据结构和运算符=(常量数据结构和); friend const数据结构和运算符+(int,const数据结构&); //... }; 类数组:公共数据结构{ 公众: 数组和运算符=(常量数据结构&); 友元常量数组&运算符+(int,常量数组&); //... }; 我们希望Array::operator=和Array的freindoperator+与DataStructure::operator=和DataStructure的freind操作符+,

假设我们有两个类:

类数据结构{
公众:
数据结构和运算符=(常量数据结构和);
friend const数据结构和运算符+(int,const数据结构&);
//...
};
类数组:公共数据结构{
公众:
数组和运算符=(常量数据结构&);
友元常量数组&运算符+(int,常量数组&);
//...
};
我们希望
Array::operator=
Array
的freind
operator+
DataStructure::operator=
DataStructure
的freind
操作符+
,除了它们应该返回
数组和
常量数组和
,而不是
数据结构和
常量数据结构&
。我需要用几十种方法来实现它,那么有没有比下面更简单的方法来实现它

数组和数组::运算符=(常量数据结构和其他){
返回(数组和)数据结构::运算符=(其他);
}
常量数组和运算符+(整数x、常量数组和其他){
返回(常量数组和)(x+(数据结构)其他);
}

编辑:我想出了另一个主意,尽管这个主意很糟糕:

类数组;
类数据结构{
公众:
//...
运算符数组&()常量;
};
//...
DataStructure::运算符数组(&()常量){
返回(数组&)*此;
}
这种方法在需要时将
数据结构
隐式转换为
数组
,尽管它仍然无法正确处理
数据结构
数组
都是合法的但做不同事情的情况,如本例所示:

//类内数据结构:
公众:

friend ostream&operator您的实现不好:
操作符=
应该返回对数组类型的对象的引用,并且不应该是虚拟的:

Array &Array::operator=(const DataStructure &other) {
    DataStructure::operator=(other);
    return *this;
}
您可以将数据结构更改为使用:

#包括
类数据结构{
公众:
数据结构(){}
内联虚拟~DataStructure(){}
数据结构和运算符=(常量数据结构和其他);
内联友元常量数据结构和运算符+(常量int a、常量数据结构和其他)
{other.add(a);返回other;}
//...
私人:
虚拟空添加(常量int a)常量=0;
};
结构数组:数据结构
{
虚拟空添加(常量int a)常量
{

std::cout您的实现不好:
操作符=
应该返回对数组类型的对象的引用,并且不应该是虚拟的:

Array &Array::operator=(const DataStructure &other) {
    DataStructure::operator=(other);
    return *this;
}
您可以将数据结构更改为使用:

#包括
类数据结构{
公众:
数据结构(){}
内联虚拟~DataStructure(){}
数据结构和运算符=(常量数据结构和其他);
内联友元常量数据结构和运算符+(常量int a、常量数据结构和其他)
{other.add(a);返回other;}
//...
私人:
虚拟空添加(常量int a)常量=0;
};
结构数组:数据结构
{
虚拟空添加(常量int a)常量
{

std::cout最终我设法找到了答案。对于
操作符=

类数组:公共数据结构{
公众:
//...
使用DataStructure::operator=;
数组和运算符=(常量数据结构&);
};
只写
Array&operator=(const-DataStructure&);
将隐藏
DataStructure::operator=
,但是使用
语句只会更改方法的返回类型

注意:
using
语句必须位于
Array&operator=(const-DataStructure&);
行之前,否则
operator=
将不明确


至于
操作符+
,我发现的唯一解决方案是非常有问题的。它使用模板:

公共数据结构{
公众:
模板友元常量T&运算符+(int,常量T&);
};
例如,如果最初的实现是

const数据结构和运算符+(int x、const数据结构和其他){
数据结构添加(其他);/*在本例中,我们假设
*“数据结构”不是抽象的*/
addition.someParameter+=x;/*为简单起见,假设
*“someParameter”是公共/受保护的*/
返回加法;
}
我们希望取得与去年相同的结果

常量数组和运算符+(int x、常量数组和其他){
返回(常量数组和)(x+(数据结构)其他);
}
我们可以简单地写下:

模板
常量T和运算符+(整数x、常量T和其他){
数据结构添加(其他);/*请注意,通常我们需要
*写“T”而不是“DataStructure”,但有时会
*给出不同的结果*/
addition.someParameter+=x;
返回(const T&)加法;
}

但是,如果存在一个与
数据结构
数组
无关的函数
运算符+(int,/*const*/ThirdClass/*&*/)
,我们就必须更改它,这可能会弄乱代码。幸运的是,通常只有几个友元函数,因此实现了一个执行转换的新方法(如问题所示)还不错。

最终我找到了答案。对于
操作符=

类数组:公共数据结构{
公众:
//...
使用DataStructure::operator=;
数组和运算符=(常量数据结构&);
};
只写
Array&operator=(const-DataStructure&);
将隐藏
DataStructure::operator=
,但是使用
语句只会更改方法的返回类型

注意:
using
语句必须位于
Array&operator=(const-DataStructure&);
行之前,否则
operator=
将不明确


至于
操作符+
,我发现的唯一解决方案是非常有问题的。它可以帮助我们