首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

抽象函数和虚函数有什么区别?

抽象函数和虚函数是面向对象编程中的两个重要概念,它们在C++等编程语言中被广泛应用。下面我们来详细讨论它们之间的区别。

抽象函数

抽象函数是一种纯虚函数,它在基类中没有实现,而是要求派生类去实现。抽象函数的主要目的是为了让派生类提供特定的实现,从而实现多态性。抽象函数的定义和实现方式如下:

代码语言:cpp
复制
class Base {
public:
    virtual void functionName() = 0;
};

在上面的代码中,functionName()是一个抽象函数,由于它前面有virtual关键字,因此它是一个虚函数。= 0表示该函数没有实现,需要派生类去实现。

虚函数

虚函数是一种在基类中声明并实现的函数,但派生类可以重写该函数。虚函数的主要目的是为了实现多态性。虚函数的定义和实现方式如下:

代码语言:cpp
复制
class Base {
public:
    virtual void functionName() {
        // 实现代码
    }
};

在上面的代码中,functionName()是一个虚函数,由于它前面有virtual关键字,因此它可以被派生类重写。

区别

  1. 抽象函数没有实现,需要派生类去实现,而虚函数有实现,可以被派生类重写。
  2. 抽象函数使用= 0来标识没有实现,而虚函数使用virtual关键字来标识。
  3. 抽象函数主要用于实现多态性,而虚函数也可以实现多态性。

总之,抽象函数和虚函数都是面向对象编程中的重要概念,它们在C++等编程语言中被广泛应用。抽象函数是一种纯虚函数,需要派生类去实现,而虚函数是一种在基类中声明并实现的函数,可以被派生类重写。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++】多态 ⑪ ( 纯函数抽象类 | 纯函数语法 | 抽象实现 | 代码示例 )

一、纯函数抽象类 1、纯函数函数 : 在 C++ 语言中 , " 纯函数 " 是 特殊类型的 函数 , " 纯函数 " 在 父类 中 声明 , 但是没有实现 ; 抽象类 : " 纯函数..." 的 作用 是将 父类 变为 " 抽象类 " , 该类不能被实例化 , 不能创建类的实例对象 ; 继承抽象类必须实现纯函数 : 任何从 " 抽象类 " 派生出来的 子类 都必须提供 " 纯函数...virtual void pureVirtualFunction() = 0; 3、抽象实现 " 抽象类 " 就是在类中定义了一个 " 纯函数 " , " 抽象类 " 至少包含一个纯函数 , 抽象类...不能 创建 实例对象 , 只能作为其它类的 父类 ; " 纯函数 " 是一种在 父类 中 声明但没有实现 的函数 , 其目的是使 父类 成为抽象类 ; 任何从抽象类派生出来的子类都必须提供 纯函数...的实现 ; " 抽象类 " 代码示例 : // 定义了纯函数的类就是抽象类 class AbstractClass { public: // 纯函数 virtual void

23630

抽象类纯函数析构

函数,一般是在设计一个基类时使用的,它将接口函数设置为纯函数后,只提供子类去继承并实现,以形成多态,除此以外不提供任何其他功能,我们称这种类为抽象类(abstract)。...【纯函数的声明语法】 virtual 函数声明 = 0; 【纯函数的特征】 1、只有声明,没有实现代码。 2、含有纯函数的类称为抽象类(abstract)。不能被实例化,只能被继承。...3、继承抽象类的意义就是提供族类的公共接口。 4、子类继承的纯函数,如果未实现,子类仍然为抽象类,仍然不能被实例化。 【函数的若干限制】 1、只有类的成员函数才能声明为函数。...函数仅适用于继承关系的类对象,所以普通函数不能声明为函数。 2、静态成员函数不能是函数静态成员函数不受对象的捆绑,只有类的信息。 3、内联函数不能是函数。...// Shape s; // 子类若未实现父类纯函数,那么这个类也是抽象类,不能被实例化 // Rect r; // 使用子类对象初始化父类对象指针,构成多态 Shape *s = new Circle

17830

函数方法什么区别

下面的实例,定义一个函数方法,然后调用函数方法。...1、调用函数时,直接使用函数名即可(如果调用者被调用者都在同一个包名下);调用方法,需要实例化结构体,然后通过结构体的方式去调用方法(结构体实例化多种,示例代码使用的是字面量的方式)。...使用指针 接下来,在函数方法中使用指针大佬修改值的效果。...都能够修改原值,这一点不管是函数还是方法,都没是一样的。 是否同名 接下来,通过下面的实例代码,来演示函数方法是否支持定义相同的名称。...⽅法接受者,⽽函数⽆接受者 1、Go语⾔的⽅法method是⼀种作⽤于特定类型变量的函数,这种特定类型变量叫做Receiver(接受者、接收者、接收器); 2、接受者的概念类似于传统⾯向对象语⾔中的this

19520

函数、纯函数

浏览量 1 1.类里如果声明了函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖(override),这样的话,编译器就可以使用后期绑定来达到多态了。...纯函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。 2.函数在子类里面可以不重写;但纯函数必须在子类实现才可以实例化子类。...3.函数的类用于 “实作继承”,继承接口的同时也继承了父类的实现。纯函数关注的是接口的统一性,实现由子类完成。...4.带纯函数的类叫抽象类,这种类不能直接生成对象,而只有被继承,并重写其函数后,才能使用。抽象类被继承后,子类可以继续是抽象类,也可以是普通类。 5.基类是继承中的基类,具体见下文继承。

42220

【c++】多态&&函数&&抽象类&&继承中的函数表详解

会得不偿失,因此:C++11提供了overridefinal两个关键字,可以帮助用户检测是否重写 2.4.1 final 修饰函数,表示该函数不能再被重写 class Car { public:...抽象类 3.1 概念 在函数的后面写上 =0 ,则这个函数为纯函数。包含纯函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。...注意表存的是函数指针,不是函数函数普通函数一样的,都是存在代码段的,只是他的指针又存到了表中。...,展现出不同的形态 反过来思考我们要达到多态,两个条件,一个是函数覆盖,一个是对象的指针或引用调用函数 再通过下面的汇编代码分析,看出满足多态以后的函数调用,不是在编译时确定的,是运行起来以后到对象的中取找的...单继承多继承关系中的函数表 5.1 单继承中的函数表 class Base { public: virtual void func1() { cout << "Base::func1" <<

32810

从零开始学C++之函数与多态(二):纯函数抽象类、析构函数

virtual 返回值类型 函数名(参数表) = 0;     }; 纯函数不需要实现 二、抽象类 作用 抽象类为抽象设计的目的而声明,将有关的数据行为组织在一个继承层次结构中,保证派生类具有要求的行为...对于暂时无法实现的函数,可以声明为纯函数,留给派生类去实现。 注意 抽象类只能作为基类来使用。 不能声明抽象类的对象。...构造函数不能是函数,析构函数可以是函数 1、抽象类不能用于直接创建对象实例,可以声明抽象类的指针引用 2、可使用指向抽象类的指针支持运行时多态性 3、派生类中必须实现基类中的纯函数,否则它仍将被看作一个抽象类...Shape类是抽象类,Draw函数是纯函数,Circle, Square, Rectangle都重新实现了Draw,在这里把Shape的析构函数声明为函数,那么delete 基类指针,会调用派生类的析构函数...    Derived d;     return 0; } // 对于一个没有任何接口的类,如果想要将它定义成抽象类,只能将析构函数声明为纯的 // 通常情况下在基类中纯函数不需要实现 //

1.3K00

【C++】函数指针函数列表

本篇文章主要来讲述,C++多态的实现原理,也就是函数函数列表是怎么回事?它们是如何实现多态的?...函数概述: 首先,C++多态的实现是通过关键字virtual,了这个关键字之后,通过继承的关系就可以在程序运行时,使用子类的函数替换掉父类的函数,达到多态的作用。...指针是跟对象绑定的,每一个类对象会对应一个指针,这个原因应该是指针是作为类的一个数据存储的导致的。例子参考 Base bb1两个对象的指针地址,明显是不相同的。 2....基类的函数列表继承类的函数列表是两个,是不相同的,继承类的函数列表中存储的是继承类的函数实现,如果继承类没有实现基类的函数的话,会存储基类的函数地址。例子参见继承类的执行结果。...C++多态的副作用 C++采用函数函数列表的方式来实现多态,确实给我们带来了很大的好处,让我们可以在不改变代码的时候,就能直接替换成运行的继承类的函数

1.4K31

C++进阶:详解多态(多态、函数抽象类以及函数原理详解)

C++进阶:详解多态(多态、函数抽象类以及函数原理详解) 结束了继承的介绍:C++进阶:详细讲解继承 那紧接着的肯定就是多态啦 1.多态的概念 多态是指同一个函数名可以根据调用对象的不同而具有不同的实现...重载允许一个函数多个定义,编译器根据函数参数上下文来选择正确的定义。 运行时多态: 通过函数继承实现,是在运行阶段确定函数调用。...包含纯函数的类叫做抽象类 (也叫接口 类),抽象类不能实例化出对象,但可以定义基类指针,用来实现多态 派生类继承后也不能实例化出对象, 只有重写纯函数,派生类才能实例化出对象 。...纯函数规范了派生类必须重写,另外纯函数更体现出了接口继承 class Car//抽象类,不能实例化出对象 { public: virtual void Drive() = 0; // 纯函数...函数普通函数一样的,都是存在代码段的,只是他的指针又存到了表中。

48910

C++纯函数抽象

编译器会为每个函数的类创建一个函数表,该函数表将被该类的所有对象共享,类的每个函数成员占据函数表中的一行。 在这个表中,存放的是一个类的函数的地址。...2.纯函数抽象类 既然函数,那为什么还需要有纯函数呢?在Java编程语言中有接口的定义,在C++中虽然没有接口关键字,但是纯函数就完成了接口的功能。...下面我们通过一个例子比较函数函数的区别: class Base { public: //这是一个函数 virtual void vir_func() { cout...而含有至少一个纯函数的类被称为抽象类。定义纯函数抽象类的目的在于,仅仅只定义派生类继承的接口,而暂时无法提供一个合理的缺省实现。...This is a virtual function of Derive This is a pure virtual function of Derive 派生类Derive实现了基类Base类的函数函数

1.5K20

接口抽象什么区别

接口抽象什么区别? 接口抽象是 Java 面向对象设计的两个基础机制。 接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到API 定义实现分离的目的。...可以一个或者多个抽象方法,- 抽象类大多用于抽取 Java 类共用方法实现或者共同成员变量。然后通过继承的方式到达代码复用的目的。...接口抽象区别 接口 Java 类实现 interface 使用 implements 关键词 继承 抽象类是使用 extends 关键词 支持多重继承:接口支持;抽象类不支持;类不支持; 支持抽象函数...:接口语义上支持;抽象类支持;类不支持; 允许函数实现:接口不允许;抽象类支持;类允许; 允许实例化:接口不允许;抽象类不允许;类允许; 允许部分函数实现:接口不允许;抽象类允许;类不允许。...定义的内容:接口中只能包括public函数以及public static final常量;抽象类与类均无任何限制。

36120

函数

定义函数的限制:   (1)非类的成员函数不能定义为函数,类的成员函数中静态成员函数构造函数也不能定义为函数,但可以将析构函数定义为函数。...(3)如果声明了某个成员函数函数,则在该类中不能出现这个成员函数同名并且返回值、参数个数、参数类型都相同的非虚函数。...构造函数同时承担着函数表的建立,如果它本身都是函数的话,如何确保vtbl的构建成功呢?   注意:当基类的构造函数内部函数时,会出现什么情况呢?...在这个表中,主是要一个类的函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有函数的类的实例(注:抽象类即有纯函数的类不能被实例化。)...下面,我将分别说明“无覆盖”覆盖”时的子类函数表的样子。没有覆盖父类的函数是毫无意义的。我之所以要讲述没有覆盖的情况,主要目的是为了给一个对比。

78231

函数与纯函数的区别

函数(impure virtual)   C++的函数主要作用是“运行时多态”,父类中提供函数的实现,为子类提供默认的函数实现。   子类可以重写父类的函数实现子类的特殊化。   ...; 纯函数(pure virtual)   C++中包含纯函数的类,被称为是“抽象类”。...抽象类不能使用new出对象,只有实现了这个纯函数的子类才能new出对象。   C++中的纯函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。   ...如下面的类包含纯函数,就是“抽象类”: class A { public: virtual void out1(string s)=0; //我是基类的函数 }; 举个栗子 #include...} //函数 virtual void xhs(){ //这个函数必须得在基类中实现 cout<<"我是基类的函数"<<endl;//即使是空的函数也要在基类中实现

1.3K10

一口气搞懂《函数函数

假设我们一位牛得一比的飞行员,他能给各式各样的飞行器加充不同的燃料,也能驾驶各式各样的飞行器。下面我们来看看这些类可以怎么设计。 ? 首先,飞行器。由于我们假设所有的飞行器都有两种行为:加油飞行。...因此我们可以将这两种行为抽象到一个基类中,并由它来派生具体的某款飞行器。...函数函数都能做到这一点,区别是,子类如果不提供函数的实现,那就会自动调用基类的缺省方案。而子类如果不提供纯函数的实现,则编译将会失败。...第四,基类提供的纯函数的实现版本,并非为了多态性考虑,因为指向子类对象的基类指针引用无法调用该版本。...第五,函数普通的函数实际上是存储在不同的区域的,函数所在的区域是可被覆盖(也称复写override)的,每当子类定义相同名称的函数时就将原来基类的版本给覆盖了,另一侧面也说明了为什么基类中声明的函数在后代类中不需要另加声明一律自动为函数

71720

构造函数析构函数可以是函数吗,在里面能调用函数

复盘 构造函数作为函数?...先说构造函数,构造函数作为函数是不可以的,首先c++编译器上不会让你通过 在内存上,我们知道,一个对象会有一个函数表,函数表在构造函数中初始化,可是一个对象还没有完成实例化,他的函数表是不存在的...构造函数作为函数让人觉得是你的构造函数可能是动态的,那我觉得这可能是另一个设计模式,对象固定,构建方法动态来达到多态的目的,后面这段是我自己的看法 析构函数作为函数?...构造函数是不行的,但是析构函数作为函数确实常用的,特别是基类的析构函数一定要声明为函数。首先既然对象存在,那么函数表肯定存在,所以析构函数作为函数是合理的。...//Father f 代码运行后,构造函数只调用了父类的函数,我们本来想要调用子类的函数

1.3K50

Thinkphp的公共函数什么区别

他们什么区别?..., 而且Class中定义的函数变量自身也高端相关, 针对性更强....就你说的用户验证为例, checkUser函数不是简单一个功能, 他需要读取数据库(调用Model), 可能还有一些我们一般都会用到的相关的函数(比如getUser, getUserGroup等), 各函数还会有公用的变量一些定义...(比如实例化的时候公用的构造函数, 还有比如UID等变量可能也需要共用), 所以, 理解成一个简单的功能(function肯定是不合适的), 所以还是建议放在Model里面....函数方法的区别 函数,你可以当做一个算法的实现。函数是单独存在的,也就是面向过程部分定义的。 方法,则可以当做一个业务逻辑的实现。方法是依赖于类存在的,也就是面向对象中定义的。

98430
领券