首页>>百科常识

虚函数的作用是什么?

今天宠物迷的小编给各位宠物饲养爱好者分享c 虚函数的作用的宠物知识,其中也会对虚函数的作用是什么?(虚数函数的作用和意义)进行专业的解释,如果能碰巧解决你现在面临的宠物相关问题,别忘了关注本站哦,现在我们开始吧!

虚函数的作用是什么?

可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时,
基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数,
而不是基类中定义的成员函数(只要派生类改写了该成员函数)。
若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都
会调用基类中定义的那个函数。

虚函数的作用是什么?

虚函数的作用是什么?

可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时,
基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数,
而不是基类中定义的成员函数(只要派生类改写了该成员函数)。
若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都
会调用基类中定义的那个函数。

虚函数有什么作用

虚函数的作用
2009-02-09 10:44:14
在面向对象的C++语言中,虚函数(virtual function)是一个非常重要的概念。因为它充分体现了面向对象思想中的继承和多态性这两大特性,在C++语言里应用极广。比如在微软的MFC类库中,你会发现很多函数都有virtual关键字,也就是说,它们都是虚函数。难怪有人甚至称虚函数是C++语言的精髓。

那么,什么是虚函数呢,我们先来看看微软的解释:

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

——摘自MSDN

这个定义说得不是很明白。MSDN中还给出了一个例子,但是它的例子也并不能很好的说明问题。我们自己编写这样一个例子:

#i nclude "stdio.h"

#i nclude "conio.h"



class Parent

{

public:

char data[20];

void Function1();

virtual void Function2(); // 这里声明Function2是虚函数

}parent;

void Parent::Function1()

{

printf("This is parent,function1\n");

}

void Parent::Function2()

{

printf("This is parent,function2\n");

}

class Child:public Parent

{

void Function1();

void Function2();

} child;

void Child::Function1()

{

printf("This is child,function1\n");

}

void Child::Function2()

{

printf("This is child,function2\n");

}

int main(int argc, char* argv[])

{

Parent *p; // 定义一个基类指针

if(_getch()=='c') // 如果输入一个小写字母c

p=&child; // 指向继承类对象

else

p=&parent; // 否则指向基类对象

p->Function1(); // 这里在编译时会直接给出Parent::Function1()的

入口地址。

p->Function2(); // 注意这里,执行的是哪一个Function2?

return 0;

}

用任意版本的Visual C++或Borland C++编译并运行,输入一个小写字母c,得到下面的结果:

This is parent,function1

This is child,function2

为什么会有第一行的结果呢?因为我们是用一个Parent类的指针调用函数Fuction1(),虽然实际上这个指针指向的是Child类的对象,但编译器无法知道这一事实(直到运行的时候,程序才可以根据用户的输入判断出指针指向的对象),它只能按照调用Parent类的函数来理解并编译,所以我们看到了第一行的结果。

那么第二行的结果又是怎么回事呢?我们注意到,Function2()函数在基类中被virtual关键字修饰,也就是说,它是一个虚函数。虚函数最关键的特点是“动态联编”,它可以在运行时判断指针指向的对象,并自动调用相应的函数。如果我们在运行上面的程序时任意输入一个非c的字符,结果如下:

This is parent,function1

This is parent,function2

c++中的虚函数是什么东西?

简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。下面来看一段简单的代码
class A{
public:
void print(){ cout<<”This is A”<<endl;}
};
class B:public A{
public:
void print(){ cout<<”This is B”<<endl;}
};
int main(){ //为了在以后便于区分,我这段main()代码叫做main1
A a;
B b;
a.print();
b.print();
}
通过class A和class B的print()这个接口,可以看出这两个class因个体的差异而采用了不同的策略,输出的结果也是我们预料中的,分别是This is A和This is B。但这是否真正做到了多态性呢?No,多态还有个关键之处就是一切用指向基类的指针或引用来操作对象。那现在就把main()处的代码改一改。
int main(){ //main2
A a;
B b;
A* p1=&a;
A* p2=&b;
p1->print();
p2->print();
}
运行一下看看结果,结果却是两个This is A。问题来了,p2明明指向的是class B的对象但却是调用的class A的print()函数,这不是我们所期望的结果,那么解决这个问题就需要用到虚函数
class A{
public:
virtual void print(){ cout<<”This is A”<<endl;}//现在成了虚函数了
};
class B:public A{
public:
void print(){ cout<<”This is B”<<endl;}//这里需要在前面加上关键字virtual吗?
};
毫无疑问,class A的成员函数print()已经成了虚函数,那么class B的print()成了虚函数了吗?回答是Yes,我们只需在把基类的成员函数设为virtual,其派生类的相应的函数也会自动变为虚函数。所以,class B的print()也成了虚函数。那么对于在派生类的相应函数前是否需要用virtual关键字修饰,那就是你自己的问题了。
现在重新运行main2的代码,这样输出的结果就是This is A和This is B了。
现在来消化一下,我作个简单的总结,指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。

关于C++虚函数和函数覆盖的问题

楼主说得很对,我再详细说一下。
c++的多态性,在编译时的表现是函数的重载,在运行时的表现就是虚函数。
所以虚函数的概念和重载类似,就是提供一个对外接口,提供多种内在实现方法。虚函数提供的是默认的方法,派生类中提供的就是派生类自己的方法。如果在派生类中定义了方法,那我们调用的时候就使用这个方法,如果没有的话,好,我们在基类的虚函数中还有一个默认的方法,我们就调用默认的。这样可以保证我们总有一个方法来解决问题。其他作用应该就没有了

在C++中用虚函数的作用是什么?为什么要用到虚函数

虚函数:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。

众所周知,在同一类中是不能定义两个名字相同、参数个数和类型都相同的函数的,否则就是“重复定义”。但是在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。例如在例12.1(具体代码请查看:C++多态性的一个典型例子)
程序中,在Circle类中定义了
area函数,在Circle类的派生类Cylinder中也定义了一个area函数。这两个函数不仅名字相同,而且参数个数相同(均为0),但功能不
同,函数体是不同的。前者的作用是求圆面积,后者的作用是求圆柱体的表面积。这是合法的,因为它们不在同一个类中。
编译系统按照同名覆盖的原则决定调用的对象。在例12.1程序中用cy1.area( )
调用的是派生类Cylinder中的成员函数area。如果想调用cy1 中的直接基类Circle的area函数,应当表示为
cy1.Circle::area()。用这种方法来区分两个同名的函数。但是这样做 很不方便。

人们提出这样的设想,能否用同一个调用形式,既能调用派生类又能调用基类的同名函数。在程序中不是通过不同的对象名去调用不同派生层次中的同名函数,而是通过指针调用它们。例如,用同一个语句“pt->display( );”可以调用不同派生层次中的display函数,只需在调用前给指针变量 pt 赋以不同的值(使之指向不同的类对象)即可。

打个比方,你要去某一地方办事,如果乘坐公交车,必须事先确定目的地,然后乘坐能够到达目的地的公交车线路。如果改为乘出租车,就简单多了,不必查行车路
线,因为出租车什么地方都能去,只要在上车后临时告诉司机要到哪里即可。如果想访问多个目的地,只要在到达一个目的地后再告诉司机下一个目的地即可,显
然,“打的”要比乘公交车 方便。无论到什么地方去都可以乘同—辆出租车。这就是通过同一种形式能达到不同目的的例子。

C++中的虚函数就是用来解决这个问题的。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。

c++中 虚函数与纯虚函数的区别是什么?

虚函数与纯虚函数 在他们的子类中都可以被重写。它们的区别是:
(1)纯虚函数只有定义,没有实现;而虚函数既有定义,也有实现的代码。
纯虚函数一般没有代码实现部分,如
virtual void print() = 0;
而一般虚函数必须要有代码的实现部分,否则会出现函数未定义的错误。
virtual void print()
{ printf("This is virtual function\n"); }
(2)包含纯虚函数的类不能定义其对象,而包含虚函数的则可以。

c++为什么需要虚函数表

楼上说的不全吧,只有纯虚类才无法实例化。 至于不能为虚函数,我的理解是: 构造函数是给类初始化调用的,明白点说就是给类中的成员变量赋初始值。 如果构造函数是虚函数,意味着肯能被重载,也就是在子类实例化的时候给父类初始化时是调用子类重载的函数,先不管合不合法,要想初始化父类,就需呀知道父类的成员变量或函数,这样岂不是父类向子类完全暴露了自己的成员?这不合乎数据封装的概念吧。 当然,这只是我个人理解,当然ANSI最新的标准貌似构造函数是可以为虚的,不过对于现在我来看的话,感觉没什么意思。

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

C++中虚函数的作用: 1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。 2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。 为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。 同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。 C++中虚函数的用法: 比如你有个游戏,游戏里有个虚基类叫「怪物」,有纯虚函数 「攻击」。然后派生出了三个子类「狼」「蜘蛛」「蟒蛇」,都实现了自己不同的「攻击」函数,比如狼是咬人,蜘蛛是吐丝,蟒蛇把你缠起来。 然后出现好多怪物的时候就可以定义一个 虚基类指针数组,把各种怪物的指针给它,然后迭代循环的时候直接 monster[i]->attack() 攻击玩家就行了,大概见下图: 扩展资料: 使用虚函数的注意事项: 一、包含虚函数的类指针列表会增大。 二、虚析构函数 析构函数的作用是在对象撤销之前做必要的“清理现场”的工作。当派生类的对象从内存中撤销的时候,会先先调用派生类的析构函数然后再调用基类的析构函数。 当我们new一个临时对象时,若基类中包含析构函数,并且定义了一个指向该基类的指针变量。 三、构造函数不能声明为虚函数 构造函数不能声明为虚函数。如果声明为虚函数,编译器会自动报出。 四、不在析构或者构造过程中调用虚函数 在析构函数或者是构造函数中,我们绝对不能调用虚函数。即使,我们在构造函数或者析构函数中调用虚函数,也不会下降至派生类中调用函数。

C#中虚函数跟抽象函数有什么用,怎么去区别

虚函数是有代码的并明确允许子类去覆盖,但子类也可不覆盖,就是说可以直接用,不用重写 。 抽象函数是没有代码,子类继承后一定要重写 在一个类中用虚函数: 是因为在超类中的有实际代码的方法,但明确允许子类可以作重写 而且当子类重写后,可以用子类实例超类;如果这样,超类变量调用虚函数时,执行的是子类的方法 在一个类中用抽象函数 是在写超类时不确定函数的代码,让子类去实现 抽象函数没有方法体。 简单来说虚函数(Virtual)已经包含了也必须包含默认的实现,所以在派生类中可以重新实现也可以不实现这些虚函数。 抽象函数(abstract)没有提供默认实现,所以在派生类中必须实现这些抽象函数。 接口中的函数类似于抽象函数,也不提供默认实现,实现接口的类也必须实现这些函数。 但接口可用于多继承,即,类只能从一个类继承,但可同时实现多个接口。

本文由宠物迷 百科常识栏目发布,非常欢迎各位朋友分享到个人朋友圈,但转载请说明文章出处“虚函数的作用是什么?

标签:宠物爱好