C ++ Проблема с полиморфными методами в векторе указателей - PullRequest
0 голосов
/ 06 апреля 2011

прежде всего, извините за мой плохой английский, я не являюсь носителем английского языка = /

У меня есть вектор указателей, указывающих на мой базовый класс A, который заполнен классами B и C.являются полиморфными классами из A, которые имеют только еще один метод setTest ().Теперь я хочу вызвать метод из B / C через вектор:

vector (A*) vec;
vec.push_back(new classB());
vec.push_back(new classC());

for(int i=0;i<3;++i)
    vec[i]->setTest(true);

Но компилятор говорит, что в моем базовом классе A. нет метода setTest (). Есть идеи, как это исправить?

1 Ответ

1 голос
/ 06 апреля 2011

Поскольку компилятор "думает", что имеет дело с 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...