从c ++中的超类数组中访问子类方法?

时间:2015-09-27 18:40:30

标签: c++ inheritance polymorphism

我有 SuperClass ,名为交易,它有方法:

  • 类型
  • 的Guid
  • 客户

然后名为订单子类具有以下方法:

  • 项目
  • 成本 ...

所以Order继承自Transaction。

我的问题是可能有多种类型的交易......订单,付款等

因此我在数组中保存每种类型的事务:

Transaction trans[100];
trans[0] = Order order(val,val,val);
trans[1] = Order order(val,val,val);
trans[2] = Order order(val,val,val);
...

但是现在当我打电话给trans[3].Get_item();时,我得到Transaction class has no method Get_item的错误,是的,它不会,但它持有的是什么。

我尝试使用->运算符使数组成为指针数组并进行访问。但问题仍然存在。

Real Code ::::::

vector<Transaction *> trans;
....
Order order(words[0], words[1], words[2], words[3], words[4], words[5]);
trans.push_back(&order);
....
trans[i]->Getitem(); //error here.

1 个答案:

答案 0 :(得分:4)

Transaction trans[100];这样的数组不能保存Transaction的子类,只能保存Transaction本身。如果你想要一个数组来保存任意Transaction子类,那么创建一个指针数组(原始与否)并不重要。带矢量和原始指针的示例:

std::vector<Transaction *> t;  
t.push_bask(new Transaction()); //insert constructor params if necessary params 
t.push_bask(new Order());  
t[0]->getType();
t[1]->getType();
...
//and don't forget delete, or use smart pointers.

如果您还需要访问父级中根本不可用的方法,编译器需要知道实际类型,即。它希望你先做一个合适的演员。如果您无法说出它的类型,则无法调用该方法。

((Order*)t[1])->getItem(); //you can do that because you know [1] is a Order  

//but this is wrong and leads to UB:
((Order*)t[0])->getItem();  //wrong!

在某些(并非所有)情况下,dynamic_cast可以帮助测试某种类型。