在C ++中输入Casting Issue

时间:2012-05-24 21:18:35

标签: c++ casting

我遇到了从基类到派生类型转换的问题(我正在施法,因为我确定该对象是那种确切的类型)。 这是我的代码(简化):

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类型的创建对象?

3 个答案:

答案 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];并适当地更新你的代码,否则使用对象赋值而不是指针赋值会杀死多态。