C++问题:使用派生类进行类升级

C++ Problem: Class Promotion using derived class

本文关键字:派生 问题 C++      更新时间:2023-10-16

我有一个Float32的类,它是从Float32_base 派生的

类Float32_base{公共://施工人员Float32_base(float x):值(x){};Float32_base(void):值(0){};运算符float32(void){return value;};Float32_base运算符=(float x){value=x;return*this;};Float32_base运算符+(float x)常量{返回值+x;};受保护:浮动值;}类Float32:public Float32_base{公共:浮动Tad(){返回值+0.01;}}int main(){Float32 x,y,z;x=1;y=2;//不会编译!z=(x+y).Tad();//编译正常z=((Float32)(x+y)).Tad();}

问题是+运算符返回Float32_base,而Tad()不在该类中。但是"x"answers"y"是Float32的。

有没有一种方法可以让我在第一行编译代码,而不必像在下一行那样使用类型转换?

如果只需要一级深度继承,就可以使用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 ();
}

您必须重写运算符+方法,因为运算符+的返回类型定义为Float32_base。您可以通过协方差来实现这一点,并使该方法成为虚拟的。然后重写子类中的方法(您可能只需要调用超类中的该方法)。

你也可以通过Templates来实现这一点,但如果你不熟悉Templates,我不建议深入研究。本质上,你可以按照已经做过的方式定义虚拟函数,但你不会返回Float32_base,而是返回你的模板类型。(只要你的模板类型是一个子类,那么C++就应该很好地使用反方差)。您的子类将使用子类的模板来扩展基类。

您可以根据运算的结果类型为FLoat32_base类设置模板。

或者将所有内容放在一个类中(可能是最好的),将少数特定于平台的操作委派给特定于平台功能。

干杯&hth。,