I believe you are able to and my colleage thinks you can't!

You cannot even declare private virtual techniques. The only real time that it will make sense at all whatsoever could be should you have had:

public class Outer
{
    private virtual void Foo() {}

    public class Nested : Outer
    {
        private override void Foo() {}
    }
}

... this is the only scenario where a type can access its parent's private people. However, this really is still prohibited:

Test.cs(7,31): error CS0621: 'Outer.Nested.Foo()': virtual or abstract people can't be private
Test.cs(3,26): error CS0621: 'Outer.Foo()': virtual or abstract people cannot be private

Your friend is appropriate. You cannot declare private virtual techniques due to there being no reason (since there'd be not a way to override them)...

However, you can override protected virtual techniques.