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 ...
随机推荐
- 【分块】bzoj3226 [Sdoi2008]校门外的区间
题解见 : http://blog.csdn.net/iamzky/article/details/41088151 ORZ ZKY 2个懒标记:是否翻转,覆盖成了什么. 怎么处理一个块上有两个标记的 ...
- 1.6(java学习笔记)static关键字
static关键字 1.static修饰变量也称静态变量,静态变量存放在静态区被该类的所有对象共享. 例如,定义了一个类class User{static Sring city = "a城& ...
- Swift中的GCD——常见的dispatch方法
什么是GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法.该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中.GCD ...
- web 中加载配置文件
1.web.xml中配置 <!-- 加载配置文件 --> <listener> <description>ServletContextListen ...
- NHibernate+MySql (erro 解决方法)
error1. Could not create the driver from NHibernate.Driver.MySqlDataDriver 解决方法:在使用Nhibernate连接Mysq ...
- Ubuntu安装“启动引导器”的设备选哪一项,选默认还是选/boot分区?
如果你要用Ubuntu的引导器代替Windows的引导器,就选 /dev/sda. 如果你要保留Windows的引导器,就选 /boot分区,但这样一来,装完Ubuntu重启后,只能启动Windows ...
- select * from sys.sysprocesses
MSDN:包含正在 SQL Server 实例上运行的进程的相关信息.这些进程可以是客户端进程或系统进程. 视图中主要的字段: 1. Spid:Sql Servr 会话ID 2. Kpid:Windo ...
- MooseFS分布式文件系统介绍及安装教程详解
MFS系统由4个部分构成:master.metalogger.chunkserver.client. 1.Master —— mfs的大脑,记录着管理信息,比如:文件大小,存储的位置,份数等,和inn ...
- hibernate学习系列-----(7)hibernate对集合属性的操作之List集合篇
今天要写的内容其实不多,本打算将hibernate对集合的操作的内容直接归结为一篇的,但想一想,还是分开写的比较好,毕竟前面的已经发布出去来了,废话不多说,开始吧! 依旧新建一个StudentList ...
- $HTTP_RAW_POST_DATA 与$_POST
出处:http://blog.163.com/gwo-cce@126/blog/static/325736492008101142422345/ 这是手册里写的 总是产生变量包含有原始的 POST 数 ...