Поскольку компилятор "думает", что имеет дело с A, он не может определить, что метод setTest
существует.
Для решения этой проблемы вы можете сделать следующее:
Добавить абстрактный метод к A:
virtual void setTest(bool value) = 0;
Обновление
Есть другой способ. Давайте создадим вспомогательный интерфейс D только одним методом:
struct D
{
virtual void setTest(bool value) = 0;
};
Чем использовать множественное изменение подписи наследования B и C:
class B : public A, public D
{
virtual void setTest(bool value)
{
//your impl goes here...
}
};
//do the same with impl of C
И наконец давайте изменим итерацию:
for(int i=0;i<3;++i)
((D*)vec[i])->setTest(true);
Простое приведение позволяет вызвать ожидаемый метод. НО!!! если вектор может содержать экземпляры A, это не удастся, поэтому использование dynamic_cast помогает:
for(int i=0;i<3;++i)
{
D *check_inst = dynamic_cast<D*>(vec[i]);
if( check_inst)
check_inst->setTest(true);
}