【摘要】

在虚函数与纯虚函数的学习中。要求理解虚函数与纯虚函数的定义,了解虚函数与纯虚函数在实例化上的差异。掌握两者在实现上的必要性。熟悉纯虚函数在子类与孙类的函数类型。本文即针对上述问题展开阐述。

【正文】

1)虚函数与纯虚函数有什么差别?

虚函数,不代表函数为不被实现的函数。为了同意用基类的指针来调用子类的这个函数。同意被其子类又一次定义的成员函数。

纯虚函数,代表函数没有被实现,为了实现一个接口,起到一个规范的作用,规范继承这个类的程序猿必须实现这个函数。

2)虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并非在编译时刻被确定的。而是在执行时刻被确定的。因为编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数。所以被成为“虚”函数。

3)纯虚函数的定义:

纯虚函数是在基类中声明的虚函数,它在基类中未定义。但要求不论什么派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”

virtual void funtion()=0;

4)定义纯虚函数的目的:使派生类只不过继承函数的接口。让全部的类对象(主要是派生类对象)都能够运行纯虚函数的动作。但类无法为纯虚函数提供一个合理的缺省实现。所以。类纯虚函数的声明就是在告诉子类的设计者,“你必须提供一个纯虚函数的实现,但我不知道你会如何实现它”。

个别纯虚函数的引入,是出于两个目的

①为了安全,由于。避免不论什么须要明白。可是由于不小心而导致未知的结果,提醒子类去做应做的实现。

②为了效率,不是程序运行的效率。而是为了编码的效率。

5)纯虚函数最显著的特征是:它们必须在继承类中又一次声明函数,并且它们在抽象类中往往未定义。

深入总结虚函数和纯虚函数

1)纯虚函数声明例如以下:virtual
void funtion1()=0;
纯虚函数一定未定义,纯虚函数用来规范派生类的行为,即接口。包括纯虚函数的类是抽象类,抽象类不能定义实例,但能够声明指向实现该抽象类的详细类的指针或引用。

2)虚函数声明例如以下:virtual ReturnType FunctionName(Parameter);虚函数必须实现,假设不实现。编译器将报错,错误提示为:error
LNK****: unresolved external symbol "public: virtual void __thiscall ClassName::virtualFunctionName(void)"

3)对于虚函数来说。父类和子类都有各自的版本号。由多态方式调用的时候动态绑定。

4)实现了纯虚函数的子类,该纯虚函数在子类中就变成了虚函数,子类的子类即孙子类能够覆盖该虚函数。由多态方式调用的时候动态绑定。

5)虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类訪问派生类定义的函数。

6)在有动态分配堆上内存的时候。析构函数必须是虚函数。但没有必要是纯虚的。

7)友元不是成员函数。仅仅有成员函数才干够是虚拟的。因此友元不能是虚拟函数。但能够通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。

8)析构函数应当是虚函数,将调用对应对象类型的析构函数,因此,假设指针指向的是子类对象。将调用子类的析构函数,然后自己主动调用基类的析构函数。

【注】

纯虚函数不能实例化一个对象

#include <iostream>
using namespace std;
class Shape
{
public:
Shape(){}
~Shape(){}
virtual void Draw() = 0;
};
int main()
{
Shape s1;
}

错误:由于Shape 不能实例化一个对象,所以要改成虚函数 virtual void Draw(){};

C++ 虚函数与纯虚函数 浅析的更多相关文章

  1. c++ 虚函数和纯虚函数

    在你设计一个基类的时候,如果发现一个函数需要在派生类里有不同的表现,那么它就应该是虚的.从设计的角度讲,出现在基类中的虚函数是接口,出现在派生类中的虚函数是接口的具体实现.通过这样的方法,就可以将对象 ...

  2. C++ - 虚基类、虚函数与纯虚函数

    虚基类       在说明其作用前先看一段代码 class A{public:    int iValue;}; class B:public A{public:    void bPrintf(){ ...

  3. C++ Primer--虚函数与纯虚函数的区别

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

  4. C++ 虚函数与纯虚函数

    #include<iostream> #include<string> using namespace std; class A{ public: virtual void f ...

  5. c/c++ 基金会(七) 功能覆盖,虚函数,纯虚函数控制

    1.功能覆盖 ClassA , ClassB ,其中ClassB继承ClassA 类的定义如下面的: #ifndef _CLASSA_H #define _CLASSA_H #include < ...

  6. C++ 虚函数 、纯虚函数、接口的实用方法和意义

    也许之前我很少写代码,更很少写面向对象的代码,即使有写多半也很容易写回到面向过程的老路上去.在写面向过程的代码的时候,根本不管什么函数重载和覆盖,想到要什么功能就变得法子的换个函数名字,心里想想:反正 ...

  7. 【C++】C++中的虚函数与纯虚函数

    C++中的虚函数 先来看一下实际的场景,就很容易明白为什么要引入虚函数的概念.假设我们有一个基类Base,Base中有一个方法eat:有一个派生类Derived从基类继承来,并且覆盖(Override ...

  8. C++中虚函数和纯虚函数的区别与总结

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

  9. C++虚函数与纯虚函数用法与区别(转载)

    1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class) ...

随机推荐

  1. set指令详解

    set指令详解 功能说明:设置shell 语 法:set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...] 说 明:设置或取消设置shell选项 ...

  2. 测试linux服务器带宽

    测试准备 1. 计划考量参数 TCP上传数据带宽 TCP下载数据带宽 UDP上传带宽 UDP下载带宽 多并发支持 稳定性 Tcp通讯网络延迟(小包:32.中包1k.大包1M) UDP通讯网络延迟(小包 ...

  3. 基本Sql语句汇总

    关于Sql语句的学习,选择的DBMS为SQL Server,Sql语句随着工作中的应用不断补充,不具备系统性,为个人笔记汇总,网上有很多优秀的资源,故不对每一处应用做过多细致的说明,后期会对部分篇幅较 ...

  4. Vue微信自定义分享时安卓系统config:ok,ios系统config:invalid signature签名错误,或者安卓和ios二次分享时均config:ok但是分享无效的解决办法

    简述需求:要求指定页面可以进行微信自定义分享(自定义标题,描述,图片,链接),剩下的页面隐藏所有基础接口.二次分享依然可以正常使用,切换至其他页面也可以正常进行自定义分享. 这两天在做微信自定义分享的 ...

  5. cxLookupCombobox的多字段模糊匹配

    查了网上很多资料,懒人输入:通过程序使用过滤对话达到自己的目的: 用到cxFilter单元: cbb_DoctorOrder.Properties.View.DataController.Filter ...

  6. HR面试你需要注意什么?

    公司的面试流程一般是笔试—>技术面试—>hr面试,在大部分应聘测试工程师这种技术岗的应聘者理解中,通常认为通过技术面试了,后面的hr面试基本就是走流程过形式.也正因如此,我们习惯性地把精力 ...

  7. 大数据学习——yum安装tomcat

    https://www.cnblogs.com/jtlgb/p/5726161.html 安装tomcat6 yum install tomcat6 tomcat6-webapps tomcat6-a ...

  8. Linux Notes:Linux下的远程登录协议及软件

    常见的远程登录协议 1.RDP(remote desktopp protocol)协议,windows远程桌面协议 2.telnet CLI 界面下远程管理,几乎所有的操作系统都有,数据明文传输,不安 ...

  9. HDU-2509-Be the Winner,博弈题~~水过~~

    Be the Winner Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ht ...

  10. DNS Prefetch 【DNS 预解析技术】

    DNS 实现域名到IP的映射.通过域名访问站点,每次请求都要做DNS解析.目前每次DNS解析,通常在200ms以下.针对DNS解析耗时问题,一些浏览器通过DNS Prefetch 来提高访问的流畅性. ...