У меня есть следующий простой классC++: как повторно использовать код в ковариантных типах возврата?
class base
{
public:
int x;
base &set(int y)
{
x = y;
return *this;
}
};
и хотите создать новую с дополнительной функциональностью, скажем, напечатать значение х. Так что я:
class derived : public base
{
public:
void print()
{
cout << x << endl;
}
};
В настоящее время в основной программе я хочу сделать что-то вроде
D.set(2).print();
, для которых, однако компилятор жалуется, что базовый класс не имеет элемент с именем «печать».
Если я пытаюсь использовать ковариантные типы возвращаемых и записать два класса в
class base
{
public:
int x;
virtual base &set(int y)
{
x = y;
return *this;
}
};
class derived : public base
{
public:
derived &set(int y)
{
x = y;
return *this;
}
void print()
{
cout << x << endl;
}
};
то оператор работает просто отлично, но я был вынужден переписать ту же самую функцию тела для «набор», в обоих классах , хотя единственное, что меняется, это тип возврата.
Если позже мне нужно изменить функциональность base :: set, мне придется пройти через все производные классы, чтобы изменить функцию «set» ... есть ли способы избежать этого? Заранее спасибо!
Do вы на самом деле создаете «базовые» объекты или он должен быть «абстрактным» классом? – delnan
Есть ли причина, по которой вы не хотите ставить 'print' на базу и переопределять по мере необходимости? –
Почему вы не используете первые два примера классов и делаете печать виртуального метода в базовом классе? – evanmcdonnal