基于继承的c++强制类型转换

C++ casting on the base of inheritance

本文关键字:c++ 类型转换 于继承 继承      更新时间:2023-10-16

我有一个叫做addV的方法,它接受两个参数。

static auto addV(Value* lval, Value* rval)

Value类型是一个父类,它有像IntegerValue, StringValue, FloatValue等子类。我永远不知道哪个孩子会被送进监狱。确定并添加它的最简单、最优雅的方法是什么?

示例:lval = IntegerValue(10), rval = StringValue("Bruce"), return = StringValue("1Bruce")

示例:lval = StringValue("Tom"), rval = IntegerValue(2), return = StringValue("Tom2")

示例:lval = IntegerValue(1), rval = FloatValue(3.0), return = FloatValue(4.0)

我之前有一篇文章是关于使用基本类型来做这个的。

价值类:

class Value {
protected:
    typedef enum{
        UndefinedType, 
        IntegerType, 
        ObjectType, 
        FloatType, 
        StringType, 
        BooleanType, 
        Last
    } DataType;
    public:
    virtual DataType returnType(){
        return UndefinedType;
    };
};

IntegerValue类:

class IntegerValue: public Value{
public:
    int32_t val;
    IntegerValue(int32_t val) : val(val){}
    DataType returnType(){
        return Value::IntegerType;
    };
};

FloatValue类:

class FloatValue: public Value{
public:
    float val;
    FloatValue(float val) : val(val) {}
    DataType returnType(){
        return Value::FloatType;
    };
};

StringValue类:

class StringValue: public Value{
public:
    string val;
    StringValue(string val) : val(val){}
    DataType returnType(){
        return Value::StringType;
    };
};

我会这样开始:

enum ValueTypesEnum {
   IntValueE = 0,
   FloatValueE = 1,
   StringValueE = 2
};

class Value {
public:
   virtual Value *create() = 0;
   virtual ValueTypesEnum getType() = 0;
   Value *max(Value *other) {
      if (getType() > other->getType()) {
         return this;
      } else {
         return other;
      }
   }
};

template <ValueTypesEnum MyType, class ValueT>
class ValueFactory:public Value {
public:
   ValueTypesEnum getType() {
      return MyType;
   }
   Value *create() {
      return new ValueT();
   }
};

class IntValue: public ValueFactory<IntValueE, IntValue> {
};
class FloatValue: public ValueFactory<FloatValueE, FloatValue> {
};
class StringValue: public ValueFactory<StringValueE, StringValue> {
};

Value *addV(Value *lval, Value *rval) {
   lval->max(rval)->create();
   // change to: return lval->max(rval)->create()->set(lval)->add(rval);
}

然后在新创建的值中添加设置元素的实现通过在具体类中实现setadd虚方法