大家好,今天来为大家解答虚函数这个问题的一些问题点,包括虚函数表在内存什么位置也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
在C++编程中,虚函数是面向对象编程中一个非常重要的概念。它使得基类的指针或引用可以指向派生类的对象,从而实现多态。什么是虚函数?它有什么作用?如何使用它?本文将深入浅出地为大家解答这些问题。
一、什么是虚函数?
虚函数是指在基类中声明的函数,在派生类中可以重新定义。当基类的指针或引用指向派生类的对象时,调用虚函数时会根据对象的实际类型来执行相应的函数。
简单来说,虚函数的作用就是实现多态。下面是一个简单的例子:
“`cpp
class Base {
public:
virtual void display() {
cout << "
什么是虚函数
虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的一般形式:
virtual函数返回值类型虚函数名(形参表)
{函数体}
虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。
当程序发现虚函数名前的关键字virtual后,会自动将其作为动态联编处理,即在程序运行时动态地选择合适的成员函数。
([2010.10.28]注:下行语义容易使人产生理解上的偏差,实际效果应为:
如存在:Base-> Derive1-> Derive2及它们所拥有的虚函数func()
则在访问派生类Derive1的实例时,使用其基类Base及本身类型Derive1,或被静态转换的后续派生类Derive2的指针或引用,均可访问到Derive1所实现的func()。)
动态联编规定,只能通过指向基类的指针或基类对象的引用来调用虚函数,其格式:
指向基类的指针变量名->虚函数名(实参表)
或基类对象的引用名.虚函数名(实参表)
虚函数是C++多态的一种表现
例如:子类继承了父类的一个函数(方法),而我们把父类的指针指向子类,则必须把父类的该函数(方法)设为virtual(虚函数)。
使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数(方法)设为virtual函数名=0我们把这样的函数(方法)称为纯虚函数。
如果一个类包含了纯虚函数,称此类为抽象类。
虚函数的实例
#include<iostream.h>
class Cshape
{ public: void SetColor( int color){ m_nColor=color;}
void virtual Display( void){ cout<<“Cshape”<<endl;}
private:
int m_nColor;
};
class Crectangle: public Cshape
{
public:
void virtual Display( void){ cout<<“Crectangle”<<endl;}
};
class Ctriangle: public Cshape
{
void virtual Display( void){ cout<<“Ctriangle”<<endl;}
};
class Cellipse:public Cshape
{
public: void virtual Display(void){ cout<<“Cellipse”<<endl;}
};
void main()
{
Cshape obShape;
Cellipse obEllipse;
Ctriangle obTriangle;
Crectangle obRectangle;
Cshape* pShape[4]=
{&obShape,&obEllipse,&obTriangle,& obRectangle};
for( int I= 0; I< 4; I++)
pShape[I]->Display();
}
本程序运行结果:
Cshape
Cellipse
Ctriangle
Crectangle
条件
所以,从以上程序分析,实现动态联编需要三个条件:
1、必须把动态联编的行为定义为类的虚函数。
2、类之间存在子类型关系,一般表现为一个类从另一个类公有派生而来。
3、必须先使用基类指针指向子类型的对象,然后直接或者间接使用基类指针调用虚函数。
C++中虚函数的作用是什么它应该怎么用呢
C++中虚函数的作用:
1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。
2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。
同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。
C++中虚函数的用法:
比如你有个游戏,游戏里有个虚基类叫「怪物」,有纯虚函数「攻击」。然后派生出了三个子类「狼」「蜘蛛」「蟒蛇」,都实现了自己不同的「攻击」函数,比如狼是咬人,蜘蛛是吐丝,蟒蛇把你缠起来。
然后出现好多怪物的时候就可以定义一个虚基类指针数组,把各种怪物的指针给它,然后迭代循环的时候直接 monster[i]->attack()攻击玩家就行了,大概见下图:
扩展资料:
使用虚函数的注意事项:
一、包含虚函数的类指针列表会增大。
二、虚析构函数
析构函数的作用是在对象撤销之前做必要的“清理现场”的工作。当派生类的对象从内存中撤销的时候,会先先调用派生类的析构函数然后再调用基类的析构函数。
当我们new一个临时对象时,若基类中包含析构函数,并且定义了一个指向该基类的指针变量。
三、构造函数不能声明为虚函数
构造函数不能声明为虚函数。如果声明为虚函数,编译器会自动报出。
四、不在析构或者构造过程中调用虚函数
在析构函数或者是构造函数中,我们绝对不能调用虚函数。即使,我们在构造函数或者析构函数中调用虚函数,也不会下降至派生类中调用函数。
什么是c++虚函数,虚函数的作用和使用方法
在某基类中声明为 virtual并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual函数返回类型函数名(参数表){函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。
虚函数定义:简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。
虚函数的作用:用同一个调用形式,既能调用派生类又能调用基类的同名函数。
虚函数的使用方法是:
在基类用virtual声明成员函数为虚函数。
这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。在类外定义虚函数时,不必再加virtual。
在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。
C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此在派生类重新声明该虚函数时,可以加virtual,也可以不加,但习惯上一般在每一层声明该函数时都加virtual,使程序更加清晰。如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。
定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。
通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。
通过虚函数与指向基类对象的指针变量的配合使用,就能方便地调用同一类族中不同类的同名函数,只要先用基类指针指向即可。如果指针不断地指向同一类族中不同类的对象,就能不断地调用这些对象中的同名函数。这就如同前面说的,不断地告诉出租车司机要去的目的地,然后司机把你送到你要去的地方。
OK,本文到此结束,希望对大家有所帮助。




