想象一下像a这样的接口contract,你正在指定一些你期望该接口的消费者实现的东西.
另一方面,当您拥有需要为类实现的一些代码时,抽象类很有用,但不是全部.您可以为需要由抽象类的子类实现的部分声明抽象方法.请记住,抽象方法必须由子类实现,但您也可以通过普通的private/public/protected/etc在类本身内提供自己的代码.方法.
因此,如果您只是编写一个您希望子类实现的契约,那么请考虑接口.但是如果你正在编写一些更像"模式"的东西,你可能会有一些方法实现(但不是全部),这对所有子实现都是通用的,那么你应该考虑抽象类.
两者都没有"更好" - 它们有不同的目的.
一个接口是当你需要定义一组具有类似语义常用的方法,但是定义这些方法的类不能从同一来源继承,并且可能有完全不同的实现.
一个抽象类是当你要部分地实现某些功能,但委托的重要部分的子类.一个抽象类的实现是不是一个接口的实现受到很大的限制,因为实现类必须从抽象类继承,他们不能重写基类的部分不属于virtual或abstract.