我遇到了从基类到派生类型转换的问题(我正在施法,因为我确定该对象是那种确切的类型)。 这是我的代码(简化):
class MyCollection
{
public:
Element* Get(int i) {
return elements[i];
}
void Add(Element* element) {
//finding i
elements[i] = element;
}
private:
Element* elements[100];
}
class Element {
public:
int ID;
}
class SpecialElement : public Element
{
public:
SpecialElement(char* name) {
this-> Name = name;
}
char* GetName() { return Name; }
private:
char* Name;
}
现在,当我在添加并在立即窗口中添加Add方法并调用GetName方法的时候添加断点时,我添加到SpecialElement的MyCollection对象时,它返回了对象的名称,但是当我执行类似的操作时这样:
void main() {
MyCollection coll = new MyCollection();
coll.Add(new SpecialElement("MyName"));
SpecialElement* foundElement = (SpecialElement*)coll->Get(0);
foundElement->GetName(); //Error
}
我想知道为什么会这样?是不是ObjectElement类型的创建对象?
答案 0 :(得分:6)
Element* Get(int i) {
return elements[i];
}
void Add(Element* element) {
//finding i
elements[i] = element;
}
这怎么编译?您将Element*
分配给Element
,反之亦然,但它们完全不同。你的整个逻辑都是荒谬的。
你过度使用动态分配,假定引用语义和错误的char*
字符串。获取C ++书籍。
此外,这个类已经存在 - 它是std::array<Element*, 100>
。或std::vector<Element*>
,如果您想要动态尺寸。
答案 1 :(得分:6)
您将其投放到基座Element
,从而切割您的SpecialElement
对象。从基础Element
转换回原始类型已丢失数据Name
,因为它不是基础的一部分。
AFAIK,你无法做你想做的事。
答案 2 :(得分:1)
你应该使用Element* elements[100];
并适当地更新你的代码,否则使用对象赋值而不是指针赋值会杀死多态。