我有一个接口(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会明显更快,因为它不需要任何反射或遍历继承树。

10-02 06:41
查看更多