va_arg и указатели
От: MTD https://github.com/mtrempoltsev
Дата: 29.10.14 18:45
Оценка:
Есть довольно развесистая иерархия классов с множественным наследованием. Для их хранения используется класс-контейнер, который инициализируется значениями в конструкторе, примерно так:

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, инициализацию именно в таком виде нужно сохранить по условию задачи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.