Этот вопрос относится к общим проблемам, обсуждаемым в следующих вопросах:
Могут ли виртуальные функции иметь параметры по умолчанию?
Параметры виртуальных функций по умолчанию
Вот что сейчас происходит в 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 с таким количеством аргументов. Обратите внимание, что производное переопределяет условие без аргумента, но не условие с одним аргументом. Кстати, в моем текущем проекте используется чисто виртуальный базовый класс. У меня часто есть указатели типа базового класса и типа производного класса. Я хочу, чтобы вызов любого указателя имел одинаковый результат.
ВОПРОСЫ:
Я прочитал много вопросов, связанных с этой темой, но, похоже, все они не дают разумных решений. Большинство решений приведут к более уродливому коду на всем протяжении вашего проекта.
Некоторые говорят: «Не используйте параметры по умолчанию для виртуальных функций», но тогда мне нужно будет установить значение по умолчанию в каждом месте, где я вызываю функцию. Кажется, было бы лучше просто добавить комментарий, в котором говорится «также изменить базовый класс» и «также изменить производный класс», чем менять везде, где вызывается функция.
Некоторые говорят, что в базовом классе есть только параметры по умолчанию, но это означает, что любой указатель на производный объект должен быть приведен обратно к базовому указателю, прежде чем можно будет использовать значения по умолчанию. Это также делает большой код уродливым.
Есть ли причины, по которым мне следует избегать вышеуказанного дизайна?
foo()
,foo(one)
иfoo(one, two)
в классеBase
иfoo()
иfoo(one, two)
в классеDerived
- person Cory-G   schedule 05.08.2014d->foo()
и чтобыfoo(3,4)
действительно произошло? - person John Dibling   schedule 05.08.2014cout
, это могло бы помочь. - person John Dibling   schedule 05.08.2014