C++问题:使用派生类进行类升级
C++ Problem: Class Promotion using derived class
我有一个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。,
相关文章:
- 从基指针到派生的强制转换问题
- 关于C++从派生类调用在基类中实现的虚拟函数的问题
- SIGSEGV 因为基/派生类的继承问题
- C 两个派生的类中有彼此的对象(包括问题)
- 使用 boost::序列化将派生类指针序列化为向量时出现问题
- 类型特征检查 CRTP 派生,在基类中,问题是未定义的类型
- 有关通过派生类在命名空间内继承的问题
- 如果私有虚拟函数被覆盖为派生类中的公共函数,那么问题是什么
- 分配派生类的对象时出现问题,其中基类具有抽象虚函数
- 覆盖派生类的函数时遇到问题
- 派生类中的模板存在问题
- 使用基对象修改/访问派生类的信息的有问题的设计
- 设计问题迫使我将基类向下转换为派生类型
- 从嵌套在模板中的类派生时编译问题
- 从派生类调用基类函数时出现问题
- 派生类问题中的C++继承默认构造函数
- 如何解决具有多个派生类的抽象基类的继承问题
- 使用Boost:serialize反序列化指向派生类的指针时出现问题
- c++派生类构造函数问题
- 继承问题:在派生类中使用基类的头文件和默认构造函数