Это звучит как проблема дизайна здесь. Если C действительно является B, он, вероятно, должен делать все, что B должен делать в OnShow. Если нет, вам, вероятно, следует использовать что-то иное, чем прямое наследование, или что-то иное, чем отдельный вызов виртуальной функции.
Если бы вы действительно этого хотели, вы могли бы иметь:
abstract class A
{
protected virtual void OnShow()
{
UniqueOnShowStuff();
base.OnShow();
}
protected virtual void UniqueOnShowStuff()
{
//
}
}
class B : A
{
protected override void OnShow()
{
// Things all B's need to Show
base.OnShow();
}
protected override void UniqueOnShowStuff()
{
// Things most B's might want to show but don't have to
}
}
class C : B
{
protected override void OnShow()
{
// Things all C's need to show
base.OnShow();
}
protected override void UniqueOnShowStuff()
{
// override without a base call so you don't show B's things
}
}
Это ужасный паттерн, и я бы не советовал его, если бы вы могли придумать лучший способ изменить дизайн объектов / функциональности.