伍仟未来网

您现在的位置是:首页 > 产业 > 正文

产业

什么是虚函数?,虚函数是什么

3695000future2024-01-02产业19
虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的一般形式:virtual 函数返回值类型 虚函数名(形参表){ 函数体 } 虚函数的作用是实现动态联编。

近很多小伙伴想了解虚函数是什么,下面是小编整理的虚函数是什么的相关内容,一起来看看吧。

文章目录:

  1. 什么是虚函数?
  2. 23. 什么是虚函数?
  3. 什么是虚函数,C++虚函数讲解

一、什么是虚函数?

可以让成员函数*作一般化,用基类的指针指向不同的派生类的对象时,

基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数,

而不是基类中定义的成员函数(只要派生类改写了该成员函数)。

若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都

会调用基类中定义的那个函数。

class A

{

virtual void AAA()

{

cout<<"这是基类的!";

}

};

class a:A

{

void AAA()

{

cout<<"这是派生类a!";

}

};

然后你生成a的实例,调用AAA()方法时,程序调用的是a中的AAA,而不是A中的AAA

如果你不定义virtual,在生成a的实例后调用的是基类的AAA()

函数的传统定义:

设在某变化过程中有两个变量x、y,如果对于x在某一范围内的每一个确定的值,y都有唯一确定的值与它对应,那么就称y是x的函数,x叫做自变量。

我们将自变量x取值的**叫做函数的定义域,和自变量x对应的y的值叫做函数值,函数值的**叫做函数的值域。

函数的近代定义:

设A,B都是非空的数的**,f:x→y是从A到B的一个对应法则,那么从A到B的映射f:A→B就叫做函数,记作y=f(x),其中x∈A,y∈B,原象**A叫做函数f(x)的定义域,象**C叫做函数f(x)的值域,显然有CB。

二、23. 什么是虚函数?

虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。

有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被改写,那么,它的派生类还是个抽象类。

定义纯虚函数就是为了让基类不可实例化化,

三、什么是虚函数,C++虚函数讲解


虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,对其执行晚绑定,即通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。通常此类指针或引用都声明为基类的,它可以指向基类或派生类的对象。
多态指同一个方法根据其所属的不同对象可以有不同的行为。
下面来看一个例子:
程序运行输出结果: 8, 12
为什么Base 对象的大小是8个字节而不是4个字节,为什么Derived 对象的大小是12个字节而不是8个字节,多出来的4个字节做什么用呢?和多态的实现有什么关系?
每一个有虚函数的类(或有虚函数的类的派生类)都有一个虚函数表,该类的任何对象中都放着虚函数表的指针。虚函数表中列出了该类的虚函数地址。多出来的4个字节就是用来放虚函数表的地址的。
每当创建一个包含虚函数的类或者从一个有虚函数的基类中派生一个类时,编译器就为这个类创建一个VTABLE,在这个表中,放置了在这个类中或它的基类中所有声明为virtual的虚函数的地址。然后编译器在这个类中放置VPTR指向相应的VTABLE。VPTR必须在构造函数中被初始化,在VPTR初始化之前,绝对不能调用虚函数。所有的基类对象或者从基类派生出的对象的VPTR都在各自对象的相同位置。所有的VTABLE有相同的顺序,不管何种类型的对象。
C++的函数调用与C一样,都是从右向左进栈的,其间,对象的首地址也即this指针的值被压入栈,正因为调用每个成员函数时this都必须作为参数压进栈,所以成员函数知道它工作在哪个特殊对象上。这样,我们总能看到,在成员函数调用之前压栈的次数等于参数个数加一(除了STatic成员函数,它没有this)。
纯虚函数 :
抽象类就是在类的声明前面加上virtual关键字,为了防止误用抽象类,可以在抽象类中定义纯虚函数,例如virtual void x()=0;
这样做,等于告诉编译器在VTABLE中为函数保留一个间隔,但在这个特定间隔不放地址,只要有一个纯虚函数,则VTABLE就是不完全的,包含纯虚函数的类称为纯抽象基类。
虚函数是C++中用于实现多态(polymorphi**)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次:
那么,在使用的时候,我们可以:
A * a = new B();
a-foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。
如下声明表示一个函数为纯虚函数:
class A
{
public:
virtual void foo()=0; // =0标志一个虚函数为纯虚函数
};
一个函数声明为纯虚后,纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。它告诉使用者,我的派生类都会有这个函数。

以上就是于虚函数是什么的介绍,希望能对大家有所帮助。