#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”时,它只是给了我一个垃圾值。可以投射一个堆栈对象吗?
答案 0 :(得分:2)
您对printValue(t);
slices的调用将您的对象转换为Descriptor
。
如果您希望此方法有效,则需要将参数定义为Descriptor &t
,以便该函数引用原始对象:
void printValue(Descriptor &t) {
...
}