Я думаю, что Вы можете и мой colleage думать, что Вы не можете!
Вы даже не можете объявить частные виртуальные методы. Единственный случай, когда это вообще имеет смысл, это если у вас есть:
public class Outer
{
private virtual void Foo() {}
public class Nested : Outer
{
private override void Foo() {}
}
}
... это единственный сценарий, в котором тип имеет доступ к приватным членам своего родителя. Однако это все равно запрещено:
Test.cs(7,31): ошибка CS0621: 'Outer.Nested.Foo()': виртуальные или абстрактные члены не могут быть приватными
. Test.cs(3,26): ошибка CS0621: 'Outer.Foo()': виртуальные или абстрактные члены не могут быть частными
Ваш коллега прав. Вы не можете объявлять частные виртуальные методы, потому что в этом нет смысла (поскольку не было бы возможности их переопределить) ...
Но вы можете переопределить защищенные виртуальные методы.