空的虚函数与纯虚函数的区别

来源:互联网 发布:剑桥英语在用系列知乎 编辑:程序博客网 时间:2024/04/30 00:54
以下内容转载自某个论坛中的回复。

如果其中一个比另外一个必然好,怎么会有两个同时存在的情况?差的那个肯定早被淘汰了。所以问“虚函数是写成纯虚函数好还是写成虚的空函数好”本身就是不合逻辑的,他们当然各有各的适宜场景 

纯虚函数适用于两种情况 
a) 接口类情况,在接口类情况下,不允许类内部包含任何实现,常见的是在DLL中包装一个实现,而通过纯虚类提供接口。在这种情况下,接口只告诉用户有那些方法可以用,而不在类中提供任何实现。不提供实现的好处在于,对于一个纯虚函数,使用dll的程序不需要找到对应的符号表,不需要链接那个dll对应的lib,只要头文件即可 

b) 基类希望每个派生类必须实现一个方法。例如你写一个GetInstanceType方法,你希望每种派生类都必须提供这个方法,如果你写了一个空的虚函数,编译器不会帮你去强迫派生类实现 

空的虚函数适用于派生类可以也可以不实现的情况。一般是对于同一个基类的不同派生类,他们提供的功能可能是不一样的,因此一些虚函数不是必须被实现 

例如我们写一个数据库访问类,提供一对Lock/Unlock函数。但是两个派生类中,一个是访问不支持多链接的数据库,根本不需要上锁,而另外一个访问基于多个链接的数据库,需要随时上锁。但是如果我们在基类中如果不提供Lock/Unlock,使用这个类的客户端就需要了解派生类是什么,然后选择是否调用Lock/Unlock,这就违背了封装原则 
原创粉丝点击