I guess, it means the following
public abstract class myBase
{
public abstract void sayHello();
}
public class child : myBase
{
public override void sayHello()
{
Console.WriteLine("hello");
}
}
Let's say, you want to add a new method in derived class(es) that should also be in base class, you could do
public abstract class myBase
{
public abstract void sayHello();
public virtual void saySomething()
{
Console.WriteLine("default something");
}
}
public class child : myBase
{
public override void sayHello()
{
Console.WriteLine("hello");
}
}
Here, the code adds the default implementation in the base class & it won't break any other code. Also, derived classes can provide for overrideen behavior, if it differs from base's saySomething.
With this in mind, inherting class(es) can provide for its own implementation.
public abstract class myBase
{
public abstract void sayHello();
// here, if one can throw `NotImplementedException`
public virtual void saySomething()
{
Console.WriteLine("default something");
}
}
public class child : myBase
{
public override void sayHello()
{
Console.WriteLine("hello");
}
public override void saySomething()
{
Console.WriteLine("child said something");
}
}