Имеется иерархия классов, в которой A — базовый, B — потомок. У A есть защищенное поле m_i, а у B добавляется защищенное поле m_j. Требуется написать метод setParams такой, что при использовании экземпляра класса из разрабатываемой иерархии, он будет принимать правильные параметры и правильно их устанавливать. Т.е. для объекта класса A пример одно значение и установит поле m_i, а для B примет два значения и установит поля m_i и m_j:
A<int>* ptr = new B<int>;
ptr->setParams(1,2); // m_i=1, m_j=2
A<int>* ptr = new A<int>;
ptr->setParams(3); // m_i=3
моя не очень удачная попытка
http://ideone.com/mataBZ
template<class T>
class A {
protected:
T m_i;
virtual void m_set(T i)
{
m_i=i;
};
public:
template<typename ... Args>
void setParams( Args&&... params )
{
m_set(std::forward<Args>(params)...);
}
virtual void show()
{
cout << m_i << endl;
}
};
template<class T, typename ... args>
class B: public A<T> {
protected:
using A<T>::m_i;
T m_j;
virtual void m_set(T i, T j)
{
m_i=i;
m_j=j;
}
public:
virtual void show() override
{
cout << m_i << ':' << m_j << endl;
}
};
int main() {
auto a = new A<int>;
a->setParams(22);
a->show();
A<int>* b = new B<int>;
a->setParams(22,23);
a->show();
return 0;
}