c++中虚函数必须有定义吗,C++中虚函数必须有定义吗?

2020-11-23 13:44:56 字数 6159 阅读 5779

1楼:呵呵

需要实例化类的虚函数必须有定义,而仅仅定义带有虚函数的类且虚函数没有实现,该类编译是可以通过的!

纯虚函数出现在接口类中,并赋值为0,不要为该函数分配函数地址,从而阻止类的实例化!纯虚函数是没有定义的,如果实现了也不是纯虚函数啦!

一般的成员函数可以只有声明,前提是在应用中不能调用该函数,否则会因找不到定义产生连接错误!

是不是只有虚函数才能定义为纯虚函数,c++语法。

2楼:千锋教育

你概念有点混淆了,这个virtual void fun()=0; 是纯虚函数;virtual void fun(); 是虚函数。它们是有区别的。有纯虚函数的类一般都是虚基类,主要用于继承,让子类来实现虚函数。

虚函数的作用当然是多态了~~

class base

{public:

void base::fun() {cout<<"base"

return 0;

} 如果fun 是虚函数显示什么,不是虚函数显示什么?自己试试

c++中虚函数如何定义,使用时应该注意什么?

3楼:千锋教育

/*--

定义纯虚函数接口:virtual void f()=0; //只是提供接口,实现留给继承类

使用时应注意:子类必须要实现该函数

--*/

#include

using namespace std;

class a

;class b:public a

};void main()

4楼:

虚函数的定义要这样,virtual 返回类型+函数名(参数);

虚函数调用时要注意,在类继承的时候,子类调用的虚函数和父类中虚函数的区别

5楼:匿名用户

虚函数在声明时与一般函数的不同地方就是需要添加一个标志符virtual,在定义时和普通函数相同。在调用时和一般函数的调用也是相同的,只不过要注意多态而已。

c++中虚函数的定义及用法?

6楼:匿名用户

z *obj=new z()就代表调用无参构造函数,不加括号也没问题如果真如你描述的一样,是

z*obj=newz();obj->fun();

的话,那么书一定是有问题的,因为obj毫无疑问是派生类指针

7楼:匿名用户

z*obj=newz();

obj->fun();

z后面的圆括号可以省略的,表示调用默认构造函数创建一个z类型的对象。obj->fun()不是通过基类指针来调用虚函数,因为单从你的问题描述来讲,z是最终的派生类。

c++中虚函数必须有定义吗?

8楼:小红帽姌殰

需要实例化类的虚函数必须有定义,而仅仅定义带有虚函数的类且虚函数没有实现,该类编译是可以通过的!

纯虚函数出现在接口类中,并赋值为0,不要为该函数分配函数地址,从而阻止类的实例化!纯虚函数是没有定义的,如果实现了也不是纯虚函数啦!

一般的成员函数可以只有声明,前提是在应用中不能调用该函数,否则会因找不到定义产生连接错误!

实例化类的虚函数必须有定义,原因如下:有虚函数作为成员函数的类, 它的实例化-对象, 在运行过程分配到的内存不止是它的成员数据, 还有一个指向该类虚函数表(vtable)的指针, 虚函数表中的每个数据项都是一个虚函数的入口地址; 如果一个对象的虚函数只有声明而没有实现, 就会出现这个虚函数表找不到本应作为其数据项之一的某函数的入口地址, 虚函数表在运行前不能装载完成, 所以产生连接错误!

c++中虚函数的作用是什么?它应该怎么用呢?

9楼:莫斯利安纯牛奶

c++中虚函数的作用:

1、简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。

2、实现多态性,多态性是将接口与实现进行分离。

3、当基类指针指向一个子类对象,通过这个指针调用子类和基类同名成员函数的时候,基类声明为虚函数就会调子类的这个函数,不声明就会调用基类的。

c++中虚函数的用法:

1、比如你有个游戏,游戏里有个虚基类叫「怪物」,有纯虚函数 「攻击」。

2、派生出了三个子类「狼」「蜘蛛」「蟒蛇」,都实现了自己不同的「攻击」函数,比如狼是咬人,蜘蛛是吐丝,蟒蛇把你缠起来。

扩展资料:

使用虚函数的注意事项:

1、包含虚函数的类指针列表会增大。

2、虚析构函数

(1)析构函数的作用是在对象撤销之前做必要的“清理现场”的工作。

(2)当派生类的对象从内存中撤销的时候,会先先调用派生类的析构函数然后再调用基类的析构函数。

(3)当我们new一个临时对象时,若基类中包含析构函数,并且定义了一个指向该基类的指针变量。

3、构造函数不能声明为虚函数

构造函数不能声明为虚函数。如果声明为虚函数,编译器会自动报出。

4、不在析构或者构造过程中调用虚函数

在析构函数或者是构造函数中,我们绝对不能调用虚函数。即使,我们在构造函数或者析构函数中调用虚函数,也不会下降至派生类中调用函数。

10楼:木子青耶

虚函数的作用:

允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。

虚函数的使用方法是:

1.在基类用virtual声明成员函数为虚函数可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。

在类外定义虚函数时,不必再加virtual。

2.在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。

在派生类重新声明该虚函数时,可以加virtual,也可以不加,但习惯上一般在每一层声明该函数时都加virtual,使程序更加清晰。

3.如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。

4.定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。

通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数;

虚函数与指向基类对象的指针变量的配合使用,就能方便地调用同一类族中不同类的同名函数,只要先用基类指针指向即可。

11楼:匿名用户

c++中虚函数的作用:

1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。

2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。

为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual returntype function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。

同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。

c++中虚函数的用法:

比如你有个游戏,游戏里有个虚基类叫「怪物」,有纯虚函数 「攻击」。然后派生出了三个子类「狼」「蜘蛛」「蟒蛇」,都实现了自己不同的「攻击」函数,比如狼是咬人,蜘蛛是吐丝,蟒蛇把你缠起来。

然后出现好多怪物的时候就可以定义一个虚基类指针数组,把各种怪物的指针给它,然后迭代循环的时候直接 monster[i]->attack() 攻击玩家就行了,大概见下图:

12楼:匿名用户

c++中虚函数的作用:

1、方便使用多态特性。

2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。

为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual returntype function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。

这样就很好地解决了上述两个问题。

声明了纯虚函数的类是一个抽象类。所以,用户不能创建类的实例,只能创建它的派生类的实例。

纯虚函数最显著的特征是:它们必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且它们在抽象类中往往没有定义。

定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。

3、纯虚函数的意义,让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供一个合理的缺省实现。所以类纯虚函数的声明就是在告诉子类的设计者,“你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它”。

虚函数的使用方法是:

1、在基类用virtual声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。在类外定义虚函数时,不必再加virtual。

2、在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。

c++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此在派生类重新声明该虚函数时,可以加virtual,也可以不加,但习惯上一般在每一层声明该函数时都加virtual,使程序更加清晰。如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。

3、定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。

4、通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。通过虚函数与指向基类对象的指针变量的配合使用,就能方便地调用同一类族中不同类的同名函数,只要先用基类指针指向即可。

如果指针不断地指向同一类族中不同类的对象,就能不断地调用这些对象中的同名函数。这就如同前面说的,不断地告诉出租车司机要去的目的地,然后司机把你送到你要去的地方。

c++里的虚函数 是不是没什么用处?

13楼:匿名用户

虚函数就相当于是在运行过程中的重载,它就是提供一个对外的默认接口。如果派生类中定义了这个借口,就使用派生类自己定义的接口,如果没有定义就用基类的。这就像我们买了一个u盘在windows下使用,windows自带了一个u盘的接口驱动程序,u盘也有一个自身的驱动程序。

我们将u盘直接插到电脑上,用windows自带的程序也能正常使用u盘,可如果我们把u盘自带的驱动程序装上,那是用的就是自带的驱动,而这个驱动可能会比windows的好用,可能使u盘存取速度更快。有点罗嗦。。虚函数应该明白了吧。

虚基类。。在多重继承中会产生二义性,虚基类正是用来解决二义性的方法。至于什么是二义性,看下面**

class a

;class b:public a

{};class c:public b

{};class d:public a,public b

{};类b和c都是从类a继承下来的,在b和c中都应该分别有一个show();类d是从b和c继承而来的,那么在d中应该有两个相同的show();这时如果调用d中的show();,就不知道到底要调用哪个,因为这两个函数没有区别,当然可以用成员名限定的方法来调用,可这不是根本的解决方法,所以就有了虚基类。虚基类可以使多层继承路径中的公共基类只产生一个实例。这就减少了很多重复**,节省开销。

下面说一下接口

说到接口就要提到纯虚函数、抽象类。纯虚函数就是在基类中不提供函数实现,而要在派生类中提供实现。至少有一个纯虚函数的类成为抽象类。

纯虚函数格式,比如上面的**,把类a中改为

virtual show()=0;这就是一个纯虚函数。在它的派生类中必须要提供实现。那么这就是一个借口的概念。

还以windows为例。我们使用的软件、硬件多得无法计算。windows不可能为每一种软硬件都提供一个默认的驱动。

于是windows就提供一个接口,如果一款软件或硬件想在windows上运行的话,好,那你根据我的接口规则,自己开发驱动程序。所以纯虚函数和虚函数的区别就是虚函数有一个默认的实现,而纯虚函数没有。就是开发者不提供自己产品的驱动,在纯虚函数为接口时就不能使用,但在虚函数做接口时就可以使用

楼主说“认真点,多定义几个对象”这句我没明白指的是什么,但我要告诉你,创建一个对象的话,是要调构造、析构等等,反正开销是很大的,所以能不创建对象就能解决的问题就不要创建对象。

C++中纯虚函数和虚函数在定义上的区别是什么

1楼 志祥罗志祥 主要就是纯虚函数相比虚函数在定义的时候没有定义函数体而且会在定义的时候在后面多加一句 0 c 中 虚函数与纯虚函数的区别是什么? 2楼 月无痕 虚函数与纯虚函数 在他们的子类中都可以被重写。它们的区别是 1 纯虚函数只有定义,没有实现 而虚函数既有定义,也有实现的 。 纯虚函数一般...