基于继承的 C++ 转换

C++ casting on the base of inheritance

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

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

Value 类型是 parent class,它有 child 类型,如 IntegerValue、StringValue、FloatValue 等。 我永远不知道 child 中的哪一个会被发送到 addV。确定它然后添加它的最简单和最优雅的方法是什么?

示例: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:

class Value {
protected:
    typedef enum{
        UndefinedType, 
        IntegerType, 
        ObjectType, 
        FloatType, 
        StringType, 
        BooleanType, 
        Last
    } DataType;

    public:
    virtual DataType returnType(){
        return UndefinedType;
    };
};

整数值class:

class IntegerValue: public Value{
public:
    int32_t val;

    IntegerValue(int32_t val) : val(val){}

    DataType returnType(){
        return Value::IntegerType;
    };
};

浮动值class:

class FloatValue: public Value{
public:
    float val;

    FloatValue(float val) : val(val) {}

    DataType returnType(){
        return Value::FloatType;
    };
};

字符串值class:

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);
}

然后在新建的值中添加setting元素的实现 通过在具体 类.

中实现 setadd 虚拟方法