虚函数?构造函数可以是虚函数吗
老铁们,大家好,相信还有很多朋友对于虚函数和构造函数可以是虚函数吗的相关问题不太懂,没关系,今天就由我来为大家分享分享虚函数以及构造函数可以是虚函数吗的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
什么是虚函数
虚函数必须是基类的非静态成员函数,其访问权限可以是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、必须先使用基类指针指向子类型的对象,然后直接或者间接使用基类指针调用虚函数。
虚函数有什么作用
虚函数的作用
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
23. 什么是虚函数
虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。
有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被改写,那么,它的派生类还是个抽象类。
定义纯虚函数就是为了让基类不可实例化化,
虚函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于构造函数可以是虚函数吗、虚函数的信息别忘了在本站进行查找哦。