我有一个Float32类,它派生自Float32_base
class Float32_base { public: // Constructors Float32_base(float x) : value(x) {}; Float32_base(void) : value(0) {}; operator float32(void) {return value;}; Float32_base operator =(float x) {value = x; return *this;}; Float32_base operator +(float x) const { return value + x;}; protected: float value; } class Float32 : public Float32_base { public: float Tad() { return value + .01; } } int main() { Float32 x, y, z; x = 1; y = 2; // WILL NOT COMPILE! z = (x + y).Tad(); // COMPILES OK z = ((Float32)(x + y)).Tad(); }
问题是+运算符返回Float32_base而Tad()不在该类中。但'x'和'y'是Float32的。
有没有办法让我可以在第一行编译代码而不必像我在下一行那样采用类型转换?
答案 0 :(得分:2)
如果您只需要一级深度继承,则可以使用CRTP:
template <typename T>
struct A
{
T
operator+ (const A&)
{ return T (); }
};
struct B : A <B>
{
void
lol ()
{ }
};
int
main ()
{
B a, b;
(a + b).lol ();
}
答案 1 :(得分:0)
您必须覆盖operator +方法,因为operator +的返回类型定义为Float32_base。您可以通过协方差来实现此目的并使该方法成为虚拟方法。然后覆盖子类中的方法(您可能只需调用超类中的方法)。
您也可以通过模板执行此操作,但如果您不熟悉模板,我建议不要深入研究。基本上你会按照你已经做的方式定义虚函数,但是不返回Float32_base,你会返回你的模板类型。 (只要您的模板类型是子类,那么C ++应该具有良好的逆转性)。您的子类将使用子类的模板扩展基类。
答案 2 :(得分:0)
您可以对结果类型的操作模拟FLoat32_base
类。
或者将所有内容放入一个类(可能是最好的),将少数特定于平台的操作委派给特定于平台的函数。
干杯&amp;第h。,