簡體   English   中英

從C ++中的超類數組訪問子類方法?

[英]Access subclass methods from array of superclass in c++?

我有稱為事務 ,它擁有一些方法:

  • 類型
  • 引導
  • 顧客

那么稱為Order子類具有以下方法:

  • 項目
  • 數量
  • 成本...

因此,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 ,是的,它沒有,但是它持有的東西。

我試過使數組變成指針數組,並使用->運算符進行訪問。 但是問題仍然存在。

實碼::::::

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.

Transaction trans[100];這樣的數組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可以幫助測試某種類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM