> -- Владимир Лось писал(а):
> Или это так по мозгам трактором логики Си++ проезжаются?

Можете называть это "трактором", но "чувствовать" используемый язык - это вполне естественно. Этот пример - хороший вопрос для собеседования, возьму на вооружение. Хороший - не потому что хитрый или с подвохом, а потому что как раз на "чувствование" и потому что есть о чем поговорить независимо от правильности ответа.

> -- Владимир Лось писал(а):
> Vlad, с логикой переназначения виртуальных функций все знакомы. Идя от общего к частному, и считая, что таки описание функции-члена принадлежит конкретному классу, почему вдруг, оказывается, что функция назначается динамикой (по таблице виртуальных методов), а назначение значений по умолчанию в аргументах - по статике?

Ну хотя бы потому, что аргументы в C++ всегда статичны и никак не влияют на виртуальность (нет в C++ виртуальности по типу аргумента, например). Единственное исключение тут можно усмотреть в ковариантных виртуальных функциях, и то оно относится к возвращаемому типу, а не к аргументам.

> -- Владимир Лось писал(а):
> То есть, у вас тоже "червь сомнения есть"

У меня нет сомнений в правильности такого дизайна или его какой-то ущербности (на что вы тут делаете упор). Предлагаемый вами дизайн ничуть не лучше (легко представить что и при таком дизайне кто-то мог сильно ругаться). Просто раз ситуация допускает разное толкование, то ее надо избежать. Тем более что это уже сделали для forward declaration обычных функций и шаблонов классов.

> -- Владимир Лось писал(а):
> То есть мало того, что бы удивиться исковерканной логике, надо ещё и закрепить наглядным примером и сверху "камешком придавить" просмотром результата в отладчике! С закреплением на подкорке! Вот только программер,почему-то, всё же от компилятора напоминания в виде ворнинга-таки возжелал...

Отладчик здесь вообще никаким боком. Достаточно понимания, что дефолтовый аргумент никак не влияет на тип указателя на функцию (и никак не участвует при создании экземпляра такого указателя). Если программист на C++ этого не понимает, то у него большой пробел в понимании языка.

P.S. Если у вас есть такое сильное желание поглумиться над ущербным дизайном C++ на примере дефолтовых аргументов, то это намного проще сделать без всяких виртуальных функций.

file1.cpp:
void f(int i) { std::cout << i << std::endl; }

file2.cpp:
void f(int i = 10);

void test1(){ f(); }

file3.cpp
void f(int i = 20);

void test1();
void test2(){ f(); }

int main()
{
test1()
test2();
}

Здесь даже нарушения ODR нет, если я правильно понимаю. А вот проблема с дизайном языка - налицо.