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

| 我有一个从Float32_base派生的Float32类     类Float32_base {         上市:         //构造函数         Float32_base(float x):value(x){};         Float32_base(void):value(0){};         运算符float32(void){返回值;};         Float32_base运算子=(float x){value = x;返回* this;};         Float32_base运算符+(float x)const {返回值+ x;};     受保护的:         浮动价值;     }     class Float32:公共Float32_base {         上市:         浮动Tad(){             返回值+ .01;         }     }     int main(){         Float32 x,y,z;         x = 1; y = 2;     //不会编译!         z =(x + y).Tad();     //完成         z =((Float32)(x + y))。Tad();     } 问题是+运算符返回Float32_base,而Tad()不在该类中。但是\'x \'和\'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 ();
}
    
        您必须重写operator +方法,因为operator +的返回类型定义为Float32_base。您可以通过协方差执行此操作,并使方法虚拟。然后在您的子类中重写该方法(您可以只在超类中调用该方法)。 您也可以通过模板来执行此操作,但是如果您不熟悉模板,则不建议您深入研究它。本质上,您将以已经执行的方式定义虚拟函数,但不返回Float32_base,而是返回模板类型。 (只要您的模板类型是子类,那么C ++就应该具有协变性)。您的子类将使用子类的模板扩展基类。     
        您可以在运算的结果类型上模板
FLoat32_base
类。 或者将所有内容放在一个类中(可能是最好的),将一些特定于平台的操作委派给特定于平台的功能。 干杯,……     

要回复问题请先登录注册