2015-09-27 3 views
1

У меня есть суперкласса называется Transaction, он имеет методы:Доступ к методам подкласса из массива суперкласса в C++?

  • Тип
  • Guid
  • Заказчик

то подкласс называется Order имеет эти методы :

  • товар
  • количество
  • стоимость ...

так Заказать наследует от сделки.

Моя проблема заключается в том, что может быть несколько типов операций ... Заказы, оплата и т.д.

Поэтому я держать каждый тип транзакции в массиве, как это:

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. 
+1

См. Также: https://en.wikipedia.org/wiki/Object_slicing, http://stackoverflow.com/questions/274626/what-is-object-slicing –

+0

Откуда вы знаете, что 'trans [i] 'указывает на' Order' (а не, скажем, на 'Payment'), и что вызов' GetItem() 'имеет смысл? Если все транзакции в векторе являются фактически заказами, тогда сохраните вектор 'Order *'. Если не все, то это вернулось к «как вы планируете знать, какие из них»? –

+0

На самом деле я снова посмотрел, и я храню тип в транзакции –

ответ

4

массив как Transaction trans[100]; не может содержать подклассы сделки, только труды себя. Если вы хотите, чтобы массив содержал произвольные дочерние классы 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 может помочь протестировать какой-либо тип.

+0

Можете ли вы опубликовать некоторый пример кода ... я сделал мои указатели, также это был вектор.'vector trans;' then 'trans [i] -> Getitem()' не работает –

+0

посмотреть обновление в quesiton –

+0

i сохранить тип в Trasnaction, чтобы я мог использовать Order casting –

Смежные вопросы