虚函数的作用 虚函数的实现原理
各位老铁们好,相信很多人对虚函数的作用都不是特别的了解,因此呢,今天就来为大家分享下关于虚函数的作用以及虚函数的实现原理的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
虚函数有什么作用
虚函数的作用
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++中虚函数的作用是什么它应该怎么用呢
C++中虚函数的作用:
1、简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。
2、实现多态性,多态性是将接口与实现进行分离。
3、当基类指针指向一个子类对象,通过这个指针调用子类和基类同名成员函数的时候,基类声明为虚函数就会调子类的这个函数,不声明就会调用基类的。
C++中虚函数的用法:
1、比如你有个游戏,游戏里有个虚基类叫「怪物」,有纯虚函数「攻击」。
2、派生出了三个子类「狼」「蜘蛛」「蟒蛇」,都实现了自己不同的「攻击」函数,比如狼是咬人,蜘蛛是吐丝,蟒蛇把你缠起来。
3、出现好多怪物的时候就可以定义一个虚基类指针数组,把各种怪物的指针给它,然后迭代循环的时候直接 monster[i]->attack()攻击玩家就行了,大概见下图:
扩展资料:
使用虚函数的注意事项:
1、包含虚函数的类指针列表会增大。
2、虚析构函数
(1)析构函数的作用是在对象撤销之前做必要的“清理现场”的工作。
(2)当派生类的对象从内存中撤销的时候,会先先调用派生类的析构函数然后再调用基类的析构函数。
(3)当我们new一个临时对象时,若基类中包含析构函数,并且定义了一个指向该基类的指针变量。
3、构造函数不能声明为虚函数
构造函数不能声明为虚函数。如果声明为虚函数,编译器会自动报出。
4、不在析构或者构造过程中调用虚函数
在析构函数或者是构造函数中,我们绝对不能调用虚函数。即使,我们在构造函数或者析构函数中调用虚函数,也不会下降至派生类中调用函数。
参考资料来源:虚函数—百度百科
c中的虚函数有什么作用
c++中的虚函数的作用如下:
1、实现多态性,多态性是将接口与实现进行分离。
2、实现以共同的方法,但因个体差异而采用不同的策略。
3、在有可能成为父类时,虚函数可以被同名子类函数覆盖,安全系数高。
4、虚函数的主要作用是对派生类实现动态联编。
5、调用的函数在基类中被说明为虚函数,子类中该函数会自动成为虚函数。
如果你还想了解更多这方面的信息,记得收藏关注本站。