-2

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

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; 
}

现在,当我添加到 SpecialElement 的 MyCollection 对象时,当我在添加时放置断点并在即时窗口中转换 Add 方法的参数并调用 GetName 方法时,它会返回我的对象​​名称,但是当我执行以下操作时:

void main() {
 MyCollection coll = new MyCollection();
 coll.Add(new SpecialElement("MyName"));
 SpecialElement* foundElement = (SpecialElement*)coll->Get(0); 
 foundElement->GetName(); //Error
}

我想知道这是为什么?不是 SpecialElement 类型的已创建对象吗?

4

3 回答 3

6
 Element* Get(int i) {
  return elements[i]; 
 }
 void Add(Element* element) {
   //finding i
   elements[i] = element;
 }

这甚至如何编译?您将 an 分配Element*给 an Element,反之亦然,但它们是完全不同的东西。你的整个逻辑都是荒谬的。

您过度使用动态分配,假设引用语义和错误的char*字符串。获取 C++ 书籍。

此外,这个类已经存在 - 它是std::array<Element*, 100>. 或者std::vector<Element*>,如果您想要动态大小。

于 2012-05-24T21:22:33.863 回答
6

您将其投射到基础上Element,从而切片您的SpecialElement对象。从您的基础转换回原始类型Element已丢失数据Name,因为这不是基础的一部分。

AFAIK,你不能做你想做的事。

于 2012-05-24T21:23:01.513 回答
1

您应该Element* elements[100];适当地使用和更新您的代码,否则使用对象赋值而不是指针赋值会杀死多态性。

于 2012-05-24T21:26:10.837 回答