# 纯虚函数
当你设计基类的时候,如果希望你的继承类一定要有某个函数,但是基类无法具体提供一个默认实现的时候。也就是继承类必须要有这个接口,但是不同继承类的该接口实现千差万别。此时你可以用上纯虚函数。类似如下`virtual void draw() = 0;`
# 虚函数
虚函数在基类的设计中的目的是,希望继承类即继承接口,也继承实现。但继承到的实现只是默认实现,你可以重写他。如果不重写,系统会调用默认实现。
使用虚函数的时候,一定要注意去重写。如果不重写,而调用了默认的实现,有的时候可能会导致错误。
如果你没有把握所有的继承类都可以默认使用这个接口的默认实现。最好的做法是,针对这个接口只提供纯虚接口。然后把大部分继承类适用的默认实现在基类中写成非虚函数。这样继承类继承了这个接口后,如果发现可以用默认实现,就会显式地去调用上述的非虚函数。 要注意的是这个非虚函数不能定义成private,如果定义成private在继承类中就无法调用了。
# 非虚函数
在基类的非虚函数表示所有的public继承类都是无条件继承的。是不允许在继承类中重定义的。否则就违反了public继承 is-a的原则,遗憾的是即使违反了,也不会报错。
网友评论