Параметры виртуальной функции по умолчанию и перегрузка
Этот вопрос относится к общим проблемам, обсуждаемым в этих вопросах:
Могут ли виртуальные функции иметь параметры по умолчанию?
Параметры виртуальных функций по умолчанию
Вот что в настоящее время происходит в c ++ с параметрами по умолчанию для виртуальных функций:
struct Base
{
virtual void foo(int one = 1, int two = 2)
{ cout << "one: " << one << " two: " << two << endl; }
};
struct Derived : public Base
{
virtual void foo(int one = 3, int two = 4)
{ Base::foo(one, two); cout << " derived!" << endl; }
};
int main()
{
Base* b = new Base();
Base* d = new Derived();
Derived* dp = new Derived();
b->foo();
d->foo();
dp->foo();
return 0;
}
выход:
one: 1 two: 2
one: 1 two: 2
derived!
one: 3 two: 4
derived!
Такое поведение я хотел бы видеть в параметрах по умолчанию для виртуальной функции c ++:
#include <iostream>
using namespace std;
struct Base
{
virtual void foo () { foo(1, 2); }
virtual void foo (int one) { foo(one, 2); }
virtual void foo(int one, int two)
{ cout << "one: " << one << " two: " << two << endl; }
};
struct Derived : public Base
{
virtual void foo() { foo(3, 4); }
virtual void foo(int one, int two)
{ Base::foo(one, two); cout << " derived!" << endl; }
};
int main()
{
Base* b = new Base();
Base* d = new Derived();
Derived* dp = new Derived();
b->foo();
d->foo();
dp->foo();
return 0;
}
выход:
one: 1 two: 2
one: 3 two: 4
derived!
one: 3 two: 4
derived!
Таким образом, в основном, если я хочу переопределить параметр по умолчанию в родительском классе, я просто создам новый foo с таким количеством аргументов. Обратите внимание, что производное переопределяет условие без аргументов, но не условие с одним аргументом. Как примечание, мой текущий проект использует чисто виртуальный базовый класс. У меня часто есть указатели типа базового класса и типа производного класса. Я хочу, чтобы звонок с любого указателя имел одинаковый результат.
ВОПРОСЫ:
Я прочитал много вопросов, связанных с этой темой, но все они, кажется, не дают разумных решений. Большинство решений приведут к созданию более уродливого кода во всем вашем проекте.
Некоторые говорят: «Не используйте параметры по умолчанию для виртуальных функций», но тогда мне нужно будет установить значение по умолчанию в каждом месте, где я вызываю функцию. Кажется, было бы лучше просто написать комментарий, который говорит: «также измените базовый класс» и «также измените производный класс», чем менять везде, где вызывается функция.
Некоторые говорят, что в базовом классе есть только параметры по умолчанию, но это означает, что любой указатель на производный объект должен быть приведен обратно к базовому указателю, прежде чем можно будет использовать значения по умолчанию. Это также делает код ужасным.
Есть ли причины, по которым я должен избегать вышеуказанного дизайна?