C++语言为我们提供了一种语法结构,通过它可以指明一个虚拟函数只是提供了一个可被子类型改写的接口。但是,它本身并不能通过虚拟机制被调用,这就是纯虚拟函数(pure virtual function)。
首先:强调一个概念
定义一个函数为虚函数,不代表函数为不被实现的函数。
定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
定义一个函数为纯虚函数,才代表函数没有被实现。
定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
简介
假设我们有下面的类层次:
实例
classA{public:virtualvoid(){cout"A::foo()iscalled"return0; }
这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓”推迟联编”或者”动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为”虚”函数。虚函数只能借助于指针或者引用来达到多态的效果。
C++纯虚函数
定义
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加 =0:

virtualvoidfuntion1()=0
引入原因
为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。
声明了纯虚函数的类是一个抽象类。所以,用户不能创建类的实例,只能创建它的派生类的实例。
纯虚函数最显著的特征是:它们必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且它们在抽象类中往往没有定义。
定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。
纯虚函数的意义,让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供一个合理的默认实现。所以类纯虚函数的声明就是在告诉子类的设计者,”你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它”。
抽象类的介绍
抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层。
总结
有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被改写,那么,它的派生类还是个抽象类。
定义纯虚函数就是为了让基类不可实例化化,因为实例化这样的抽象数据结构本身并没有意义,或者给出实现也没有意义。
实际上我个人认为纯虚函数的引入,是出于两个目的:
关于c++中虚函数作用是什么?
指针的类型是可以强行转来转去的。 普通情况你转什么类型就调对应类型的同名函数。 但是虚函数实现多态后,尽管可能你把指针转成父类的类型,但是因为创建的时候是子类的类型,它还是会调用子类的这个虚函数。 这样可以统一代码且正确运用子类的新特性。 也因为如此,如果父类虚函数不做实现而=0成为纯虚函数,那么父类就不可以实例化,这个没有实现的虚函数也永远不会调用。 因为根据多态的动态联编,总是会调用实例化了的子类的该方法。 指针强行转成父类也不会调用纯虚函数。 想要更系统化的理解,建议看看老外编写国人译著的C++书籍。
C语言中a=sizeof(3+ 5.0)的注释是
先上结果,a的值为double型变量占据内存空间的大小5.0,属于double型变量,3+5.0亦为double型变量,sizeof(3+5.0);等价于sizeof(double);
什么是VC++ [编程]
VC++是微软公司开发的一个IDE(集成开发环境),可以编写小程序解数学题;制作游戏程序和简单的系统程序;制作应用软件。
发表评论