>> Abstract classes
Generally created when you find any common function/tasks across two components.
For example, In Master Driver component and Slave driver component, we need function called drive_dut() to send transaction to interface this we can include in the abstract class.
drive_dut is simple example I gave but if you more commmon tasks/functions you can add them.
Here now ahb_abstract_drv class puts restriction on the user to implement those common tasks/functions for that interface.
this methodology is generally followed when you are trying to build components from scratch.
>> Overriding the driver using configuration object::
Lets say you already have driver implemented(by someone) you just want to modify something some internals then extend driver class and override with new driver.
Now being said that all these, the proposal you gave also works, but I rarely engineers using that approach.
regards,
Santosh