как использовать унаследованную переменную в переполнении стека

У меня есть вопрос к унаследованным переменным. Части моего исходного кода:

class Piston{           //abstract class
...                  //virtual functions
};

class RectangularPiston: public Piston
{
...                   //non virtual implementation of the Piston functions
bool setGridSize(...) //this function doesn't exists in the Piston class
{
...
}
}

class Transducer{       //abstract class
...                 //virtual functions
protected:
Piston *m_piston;
};

class RectilinearTransducer: public Transducer
{
... //non virtual implementation of the Piston functions
bool setGridSizeOfPiston(...)
{
return m_piston->setGridSize(...);  //doesn't work
}

}

RectilinearTransducer содержит m_piston, который всегда является RectlinearPiston!
Но m_piston наследуется классом Transducer, и я не могу использовать функцию setGridSize ().

сообщение об ошибке: ошибка C2039: «setGridSize»: нет элемента «поршень»

Функция setGridSize не существует в классе Piston …

Как я могу решить эту проблему?
Должен ли я перезаписать переменную m_piston, как я могу сделать это с виртуальными функциями? Переменная m_piston существует как Piston * m_piston, потому что я унаследовал ее от класса Transducer.

Спасибо за помощь

4

Решение

Если вы не можете сделать setGridSize виртуальная функция в родительском, то вы можете добавить функцию, которая просто m_piston в RectangularPiston* затем вызвать эту функцию, когда ваш класс должен ссылаться на m_piston,

RectangularPiston* getRecPiston() {
return static_cast<RectangularPiston*>(m_piston);
}

bool setGridSizeOfPiston(...) {
return getRecPiston()->setGridSize(...)
}
2

Другие решения

Вам нужно сделать setGridSize виртуальная функция Piston (или чисто виртуальный или иным образом).

например

class Piston {
protected: (or public)
virutal bool setGridSize(..) = 0;
...
3

По вопросам рекламы [email protected]