我有一个接口(interface)类:
Class IOperand
{
virtual ~IOperand() {};
virtual std::string getType() const = 0;
}
我有几个像这样的继承类:
class Int8: public IOperand
{
public:
Int8(int8_t _value = 0);
virtual ~Int8() {};
virtual std::string getType() const;
int8__t getValue() const;
private:
int8_t _value
}
我在IOperand类型上使用了指针,但是我需要使用getValue()成员函数。
如何根据getType()的返回值(返回一个包含目标子类名称的字符串)在子类类型对象中强制转换IOperand类型对象?
最佳答案
您要求将基本类型转换为派生类型。通常,这种类型的转换表明设计不佳,因为在大多数情况下,基本类型应提供一种提供所需操作的虚拟方法。但是,在某些情况下,有必要强制转换为特定的类。确实有两种方法可以做到这一点。
未知的运行时类型
如果您不知道类型是否为Int8,则需要多态下转换。这是通过特殊的dynamic_cast
机制完成的,如下所示:
IOperand* operand = // ...
Int8* casted = dynamic_cast<Int8*>(operand);
if (casted == nullptr) {
// runtime type was not an Int8
return;
}
// operate on casted object...
已知的运行时类型
如果您绝对确定类型是子类型,则可能要使用
static_cast
。但是请注意,static_cast
不会像dynamic_cast
那样进行检查。但是,这样做static_cast
会明显更快,因为它不需要任何反射或遍历继承树。