Один ответ будет: просто потому что. Это правило. У тебя тоже есть. Точка.
Если вы хотите другое правило, придумайте другой язык. Просто попробуйте сделать это, если вам не нравится правило на каком-либо языке программирования, и вернитесь к нам, расскажите нам, с какой точной семантикой вы пришли.
Но более глубокий ответ заключается в том, что для виртуального это будет иметь мало смыслазагрязнять не виртуальные вещи.
Ожидаете ли вы, что не виртуальная функция-член станет виртуальной, потому что какая-то другая функция с такой же сигнатурой является виртуальной в каком-то другом классе, и в итоге они становятся двумя базами? Это реальный вопрос, на воображаемом языке, который вы бы составили для своей интуиции:
struct A {
void f(); // non virtual!
};
struct AA : A {
void f(); // non virtual, hides, does not override
};
struct B {
virtual void f();
};
struct BB : B {
void f(); // virtual overrider
};
struct A {
void f(); // non virtual!
};
struct AABB : AA, BB {
// is AA::f() now virtual? what about A::f()?
};
Если вы не ожидаете, что виртуальность в BB
изменит семантику AA
, тогда выиметь общий ответ: написание виртуального не изменяет виртуальность какой-либо ранее установленной виртуальности.
Итак, все, что вы должны принять, это то, что виртуальность является свойством наследования, отношения один к одному, между производнымкласс и его база. Наследование устанавливается как виртуальное или не виртуальное в любом данном классе.