以下内容转载自某个论坛中的回复。
纯虚函数适用于两种情况
a) 接口类情况,在接口类情况下,不允许类内部包含任何实现,常见的是在DLL中包装一个实现,而通过纯虚类提供接口。在这种情况下,接口只告诉用户有那些方法可以用,而不在类中提供任何实现。不提供实现的好处在于,对于一个纯虚函数,使用dll的程序不需要找到对应的符号表,不需要链接那个dll对应的lib,只要头文件即可
b) 基类希望每个派生类必须实现一个方法。例如你写一个GetInstanceType方法,你希望每种派生类都必须提供这个方法,如果你写了一个空的虚函数,编译器不会帮你去强迫派生类实现
空的虚函数适用于派生类可以也可以不实现的情况。一般是对于同一个基类的不同派生类,他们提供的功能可能是不一样的,因此一些虚函数不是必须被实现
例如我们写一个数据库访问类,提供一对Lock/Unlock函数。但是两个派生类中,一个是访问不支持多链接的数据库,根本不需要上锁,而另外一个访问基于多个链接的数据库,需要随时上锁。但是如果我们在基类中如果不提供Lock/Unlock,使用这个类的客户端就需要了解派生类是什么,然后选择是否调用Lock/Unlock,这就违背了封装原则