C++:如何在协变返回类型中重用代码
C++: how to reuse code in covariant return types?
我有以下简单的类
class base
{
public:
int x;
base &set(int y)
{
x = y;
return *this;
}
};
并想创建一个具有附加功能的新产品,例如打印值 x。所以我这样做:
class derived : public base
{
public:
void print()
{
cout << x << endl;
}
};
现在在主程序中,我想做类似的事情
D.set(2).print();
然而,编译器抱怨类基没有名为"print"的成员。
如果我尝试使用协变返回类型并将这两个类写为
class base
{
public:
int x;
virtual base &set(int y)
{
x = y;
return *this;
}
};
class derived : public base
{
public:
derived &set(int y)
{
x = y;
return *this;
}
void print()
{
cout << x << endl;
}
};
那么该语句工作得很好,但我被迫在两个类中为"set"重写完全相同的函数体,即使唯一改变的是返回类型。
如果以后我需要更改 base::set 的功能,那么我将不得不遍历所有派生类来更改"set"函数......有什么方法可以避免这种情况吗?提前感谢!
根据您的情况,您可能能够使用 CRTP:
template <class D>
class base {
D& set(int x) {
…;
return *static_cast<D*>(this);
}
};
class derived : base<derived> { … };
C++按照
你说的做,你在基类中说set
返回base&
,所以这就是C++做的事情。但是为了解决这个问题,你有很多方法。
首先,您不会被迫创建一个函数virtual
在派生类中重写它(请注意,虚拟调用比普通调用稍慢)。
其次,您可以将基类实现引用为 base::set
因此代码将如下所示:
class base {
...
base& set( int x ) {...}
};
class derived : public base {
derived& set( int x ) {
return static_cast<derived&>( base::set(x) );
}
};
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 调用C++具有复杂参数和复杂返回类型的函数 C 代码
- 为什么在下面的代码返回类型中是用于运营商重载的类类型
- 模板函数的返回类型未知,使用 decltype 时代码重复
- 如何使用enable_if设置以下 c++ 代码的返回类型
- 通用lambda,继承和尾随返回类型:此有效代码
- C++:如何在协变返回类型中重用代码
- 无法理解代码段的返回类型
- 众所周知,构造函数没有返回类型,但在下面的代码中,构造函数正在返回..任何人都能解释吗
- Visual Studio c++代码格式-返回类型+ classname::func缩进
- 返回类型而不是对象如何有效,误解代码片段
- 具有多重继承的协变返回类型.这些代码是如何工作的
- 代码重复和模板专用化(当专用函数具有不同的返回类型时)
- 为什么我不能在下面的代码中使用"pos_type"返回类型?
- 为什么当我改变函数返回类型时,c++代码的输出会改变