我有 SuperClass ,名为交易,它有方法:
然后名为订单的子类具有以下方法:
所以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.
答案 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可以帮助测试某种类型。