Есть довольно развесистая иерархия классов с множественным наследованием. Для их хранения используется класс-контейнер, который инициализируется значениями в конструкторе, примерно так:
template <class T>
class Array
{
Array(int size, T first, ...)
: data_(new T[size])
{
data_[0] = first;
va_list values;
va_start(values, first);
for(int i = 1; i < size; ++i)
{
data_[i] = va_arg(values, T);
}
va_end(values);
}
};
Если создавать класс таким образом:
Array<Base*>* a = new Array<Base*>(3, (Base*) new A(), (Base*) new B(), (Base*) new C());
То все хорошо, но если убрать приведение к базовому типу:
Array<Base*>* a = new Array<Base*>(3, new A(), new B(), new C());
То такое ощущение, что разваливается таблица виртуальных функций, вызов методов базового класса у сохраненных объектов приводит к падению с ошибкой памяти. Проверялось на mingw и MS VS 2013.
В чем причина и можно ли обойтись без явного приведения? С++03, инициализацию именно в таком виде нужно сохранить по условию задачи.