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
的freindoperator+
与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=
将不明确
至于操作符+
,我发现的唯一解决方案是非常有问题的。它可以帮助我们