c++ virtual 和 pure virtual的区别
参考资料:
http://stackoverflow.com/questions/1306778/c-virtual-pure-virtual-explained
验证代码:
#include <iostream>
using namespace std;
class Base {
public:
virtual void VirtualFunc() { cout << "Base virtual" << endl; }
void NonVirtualFunc() { cout << "Base non-virtual" << endl; }
};
class Derived : public Base {
public:
void VirtualFunc() { cout << "Derived virtual" << endl; }
void NonVirtualFunc() { cout << "Derived non-virtual" << endl; }
};
int main()
{
Base base;
Derived derived;
Base *dPtr = &derived, *bPtr = &base;
// Base &dRef = derived, &bRef = base; // 使用引用代替指针也是一样的效果
dPtr->VirtualFunc();
dPtr->NonVirtualFunc();
bPtr->VirtualFunc();
bPtr->NonVirtualFunc();
return ;
}
1、加了virtual关键字,就可以使用polymorphism(多态)的特性(上述代码已验证)
2、加了virtual关键字,可以在Base就提供implementation,允许生成Base的objects(上述代码已验证)
3、加了virtual关键字,并加上 "=0",就成为pure virtual,Base不允许提供implementation,因此也就不允许生成Base的objects(尝试把Base.VirtualFunc改为pure的再编译,会报错,即使你提供了implementation也要报错)
4、Derived继承了Base,除非提供了implementation,否则继续保持从Base继承得来的virtual或者pure virtual特性
总结:
1、virtual本身是用来说明:这个function可以实现polymorphism的特性,仅virtual关键字本身并不会导致一个class是abstract的(也就是说就如Base一样,你可以在Base中定义一个virtual function,但是只要你提供了该function的实现,则Base仍然是可实例化的)。如果一个class有sub-class,那么显然这个class的destructor必须是virtual的(否则在delete Base-class的pointer的时候可能无法正确的执行到Sub-class的destructor),现在的编译器一般都会检测到这个问题并给出warning
2、pure virtual是virtual的特例(也就是说,既提供了polymorphism的特性,还提供了更强的约束性),这个“更强的约束性”体现在哪儿呢?:定义pure virtual function的class不可实例化(例如你把Base.VirtualFunc改为pure的,那么Base就不能生成objects了,哪怕你为VirtualFunc提供了实现也不行,因为编译器禁止为pure virtual function提供实现);而通过继承而得到pure virtual function的class在override(重写,也就是提供该pure virtual function的implementation)该pure virtual function之后可以生成objects,否则继续保持abstract的特性。pure virtual是用来实现类似于java中的abstract class和interface特性,也就是说pure virtual的存在会导致一个class具有abstract的特性
c++ virtual 和 pure virtual的区别的更多相关文章
- pure virtual function call
2015-04-08 10:58:19 基类中定义了纯虚函数,派生类中将其实现. 如果在基类的构造函数或者析构函数中调用了改纯虚函数, 则会出现R6205 Error: pure virtual fu ...
- pure virtual、impure virtual、non-virtual函数的接口继承和实现继承
1.abstract class 拥有pure virtual函数的class是abstract class. 不能创建abstract class的实体. 2.pure virtual 函数 他们必 ...
- Mindjet MindManager 2012 从模板创建出现“Runtime Error pure virtual function call” 解决方法
我的Mindjet MindManager 2012 Pro也就是MindManager10 在应用模板之后总会显示 Microsoft Visual C++ Runtime Library Runt ...
- 结合实例详解"pure Virtual function called"
作者:阿波 链接:http://blog.csdn.net/livelylittlefish/article/details/9750593 (4年前的一篇文章,翻出来共享一下.) 本实例即为经典的讲 ...
- why pure virtual function has definition 为什么可以在基类中实现纯虚函数
看了会音频,无意搜到一个frameworks/base/include/utils/Flattenable.h : virtual ~Flattenable() = 0; 所以查了下“纯虚函数定义实现 ...
- [C++] Pure Virtual Function and Abstract Class
Pure Virtual Function Abstract Class
- 纯虚函数(pure virtual function )和抽象类(abstract base class)
函数体=0的虚函数称为“纯虚函数”.包含纯虚函数的类称为“抽象类” #include <string> class Animal // This Animal is an abstract ...
- 深入解析pure virtual function call
在本文中,我们将不解释为什么会提示“纯虚拟函数调用”和如何提示“纯虚拟函数调用”,而是详细解释在win32平台的构造函数/析构函数中直接/间接调用纯虚拟函数时程序本身.在开始时,将显示一个经典示例,在 ...
- ASP.NET :Virtual Application vs Virtual Directory
原文地址:http://blogs.msdn.com/b/wenlong/archive/2006/11/22/virtual-application-vs-virtual-directory.asp ...
随机推荐
- Bootstrap-table实现动态合并相同行(表格同名合并)
写在前面: 有时候表格的需求就是奇奇怪怪的,最近要做的表格需要实现当紧挨着的记录的某一列的行元素内容相同,就将其合并.要是不是相同的就不合并.如果表格数据的顺序不需要被改变,这个样子是可以很简单就完成 ...
- Java多线程——锁概念与锁优化
为了性能与使用的场景,Java实现锁的方式有非常多.而关于锁主要的实现包含synchronized关键字.AQS框架下的锁,其中的实现都离不开以下的策略. 悲观锁与乐观锁 乐观锁.乐观的想法,认为并发 ...
- Python的hashlib
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制 ...
- TCP Socket一些东西
1. 若connect失败该套接字不可再用,必须close当前套接字,重新调用socket. 手册上注明连接失败后, socket的状态是未知的, 所以再次connect, 可能成功, 也可能失败. ...
- 使用Jenkins部署Spring Boot
原文:http://www.cnblogs.com/ityouknow/p/7899349.html jenkins是devops神器,本篇文章介绍如何安装和使用jenkins部署Spring Boo ...
- Kubernetes dashboard集成heapster
图形化展示度量指标的实现需要集成k8s的另外一个Addons组件: Heapster . Heapster原生支持K8s(v1.0.6及以后版本)和 CoreOS ,并且支持多种存储后端,比如: In ...
- iOS:CocoaPods详解
原文地址:http://blog.csdn.net/wzzvictory/article/details/18737437 一.什么是CocoaPods 1.为什么需要CocoaPods 在进行iOS ...
- Delphi 7下最小化到系统托盘
在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本.定义如下: 123456789 _NOTIFY ...
- 深入理解CommonJS!
CommonJS 一开始大家都认为JS是辣鸡,没什么用,官方定义的API只能构建基于浏览器的应用程序,CommonJS就按耐不住了,CommonJS API定义很多普通应用程序(主要指非浏览器的应用) ...
- vmware已经全面支持open-vm-tools
以后不用再为vmware vm单独安装vmware-tools了,vmware已经全面支持open-vm-tools, 今天突然发现安装vmware-tools时出现deprecated提示,原来vm ...