为什么dynamic_cast <>(VAR)仅在VAR在堆上时才起作用?

时间:2019-03-17 20:26:08

标签: c++ dynamic-cast

#include <iostream>

enum types { INTEGER, DOUBLE, BOOL, STRING };

class Descriptor {

public:
    Descriptor(types type):
        _type{type}
    {}
    types &type() { return _type; }


    virtual ~Descriptor() = default;

private:
    types _type;
};

class Number: public Descriptor {

public:
    Number(types descType):
        Descriptor(descType)
    {}

    virtual ~Number() = default;

    int intValue;
};


void printValue(Descriptor t) {

  auto cast = dynamic_cast<Number *>(&t);
  if (cast == nullptr) {
    std::cout << "Err" << std::endl;
  } else {
    std::cout << "Works" << std::endl;
  }
}


int main() {

  Number t =  Number(INTEGER);
  t.intValue = 1;

  printValue(t);
}

输出始终为Err。但是,当我更改Number(主要是)以使用新的方法在堆上分配时,强制转换有效并且能够访问Number类中的任何函数?

强制转换堆栈对象有什么区别?当我尝试使用静态强制转换并访问“ intValue”时,它只是给了我一个垃圾值。可以投射一个堆栈对象吗?

1 个答案:

答案 0 :(得分:2)

您对printValue(t); slices的调用将您的对象转换为Descriptor

如果您希望此方法有效,则需要将参数定义为Descriptor &t,以便该函数引用原始对象:

void printValue(Descriptor &t) {
    ...
}

Online demo