- 在
Virrual Functions
中, - 如果只创建一个
Entity
的实例e
,然后调用方法e.GetName()
,那么会打印Entity
; - 如果创建一个
Player
的实例player
(Player player("Cherno")
),然后调用方法player.GetName()
,那么会打印Cherno
;这样,无论子类是否对GetName()
这个函数重新定义,都可以调用这个函数;
- 如果想强制子类,为函数提供自己的定义,可以创建一个类,只由未实现的方法组成,然后强制子类去实现它们。这就是接口。因此,类中的接口只包含未实现的方法,作为模板
- 因为这个接口类并补包含方法的实现,因此不能实例化这个接口类。
- 这样,在
main
我们将不能再实例化Entity
类。我们必须给它一个子类来实现这个函数。
- 假设我们想要编写一个函数来打印这些类的类名。
- 这里,我们需要填入的是一个类型,保证一定可以提供
GetClassname
函数。这就是接口(Interface)。不妨就把这个叫做Printable。
- 接下来,需要修改上面的代码,创建一个新的类叫
Printable
,它唯一会有的是创建一个public virtual function
,返回一个字符串
- 接下来让
Entity
实现这个接口:
- 这里,因为
Player
已经是Entity
的子类了,所以我们不需要额外为Player
也写上接口,如下:
- 否则,我们需要这样写:
- 现在,所有类都需要实现这个
GetClassName
函数,否则将无法实例化。
- 这样,
Print
函数接受Printable
作为参数,并不关心具体是什么类。如下创建一个新的类试试:
- 然后,就可以直接调用
Print(A)
。