Есть список MyList. Мне нужно чтобы в методе addItem вызывался копирующий конструктор класса у объекта переданного в метод addItem, а не только класса родителя T. Как это можно сделать?
template <class T>
MyList {
...
//метод получает объект класса T и производные от него
void addItem(T& item) {
...
node.x = new T(item);
...
}
}
Вообще-то вы натолкнули на решение.
Делаем ваш метод добавления шаблонным. Что-то вроде
template<typename T>
class myList
{
T* data[3];
public:
template<typename U>
void add(int i, const U& u)
{
data[i] = new U(u);
}
void out()
{
for(const auto& p: data) p->out();
}
};
struct Base
{
virtual void out() { cout << "Base\n"; }
};
struct D1: public Base
{
void out() { cout << "D1\n"; }
};
struct D2: public D1
{
void out() { cout << "D2\n"; }
};
int main(int argc, const char * argv[])
{
myList<Base> m;
Base b;
D1 d1;
D2 d2;
m.add(0,b);
m.add(1,d1);
m.add(2,d2);
m.out();
}
Код максимально упростил, чтоб показать саму идею. Его можно снабдить проверками, например, что добавляется именно наследник или иной функциональностью. Но идея должна быть понятна.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости