基于继承的 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元素的实现
通过在具体 类.
中实现 set
和 add
虚拟方法
我有一个名为 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元素的实现 通过在具体 类.
中实现set
和 add
虚拟方法