Параметры виртуальной функции по умолчанию и перегрузка

Этот вопрос относится к общим проблемам, обсуждаемым в этих вопросах:

Могут ли виртуальные функции иметь параметры по умолчанию?

Параметры виртуальных функций по умолчанию

Вот что в настоящее время происходит в 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 с таким количеством аргументов. Обратите внимание, что производное переопределяет условие без аргументов, но не условие с одним аргументом. Как примечание, мой текущий проект использует чисто виртуальный базовый класс. У меня часто есть указатели типа базового класса и типа производного класса. Я хочу, чтобы звонок с любого указателя имел одинаковый результат.

ВОПРОСЫ:

Я прочитал много вопросов, связанных с этой темой, но все они, кажется, не дают разумных решений. Большинство решений приведут к созданию более уродливого кода во всем вашем проекте.

Некоторые говорят: «Не используйте параметры по умолчанию для виртуальных функций», но тогда мне нужно будет установить значение по умолчанию в каждом месте, где я вызываю функцию. Кажется, было бы лучше просто написать комментарий, который говорит: «также измените базовый класс» и «также измените производный класс», чем менять везде, где вызывается функция.

Некоторые говорят, что в базовом классе есть только параметры по умолчанию, но это означает, что любой указатель на производный объект должен быть приведен обратно к базовому указателю, прежде чем можно будет использовать значения по умолчанию. Это также делает код ужасным.

Есть ли причины, по которым я должен избегать вышеуказанного дизайна?