c++中的虚函数的作用如下:
1、实现多态性,多态性是将接口与实现进行分离。
2、实现以共同的方法,但因个体差异而采用不同的策略。
3、在有可能成为父类时,虚函数可以被同名子类函数覆盖,安全系数高。
4、虚函数的主要作用是对派生类实现动态联编。
5、调用的函数在基类中被说明为虚函数,子类中该函数会自动成为虚函数。
我也碰到过你类似的迷惑,特别是书上举的例子,让你越来越迷惑。事实上,你根本就无法想象那些作者的无知和愚蠢,举的垃圾例子给你感觉就是对知识的侮辱!
好了,下面我用一句话给你概括虚函数的作用,再用一个例子让你去体会。
1、基于向上类型转换,基类通过虚函数可以对多个子类相似的功能实现统一管理。
2、例子:
A为基类,B、C为A的同级子类。virtual只需在基类中标识一次,子类无需重复标识。
class A
{
virtual void display(){cout<<"我是A"<<endl;}
}
class B:public A
{
void display(){cout<<"我是B"<<endl;}
}
class C:public A
{
void display(){cout<<"我是C"<<endl;}
}
void display(A s)//以A类型作为参数的顶层函数,不同于类中的成员函数
{
sdisplay();//调用对象s的成员函数
}
int main()
{
A x1;
B x2;
C x3;
display(x1);//显示:我是A。
display(x2);//参数x2向上转换为x1类型,显示:我是B。
display(x3);//参数x3向上转换为x1类型,显示:我是C。
}
通过显示我们注意到以下两点:
1、尽管在顶层函数的定义中是以基类A作为其参数,但却能接受基类A的任一子类作为其参数。事实上,这是基于自动向上类型转换,即子类转换为它的父类型。
2、虽然子类转换成了它的父类型,但却可正确调用属于子类而不属于父类的成员函数。这是虚函数的功劳。
这样,我们通过设计一个以基类型作为参数的顶层函数,就可实现基类及其所有子类相似功能的统一管理,而不用理会不同对象自身的类型。
当然你还是可以利用域解析符去调用想要的成员函数,但情况并不总是那么顺利。当类层次很多时,你可能都不太记得你创建的对象属于哪个类型了。
virtual
关键词可以将一个类的函数说明为虚函数
虚函数的主要用处是对派生类实现动态联编举例说明一下:
class
a
{
virtual
int
func(){return
1;}
}
class
b:public
a
{
int
func(){return
2;}
}
void
main()
{
a
p;
p=new
b;
p->func();//得到的结果是2
}
由上面简单的例子可知,一个基类的指针可以指向他的子类,使用该指针调用函数时,如果调用的函数在基类中被说明为虚函数,那么子类中该函数也自动成为虚函数,调用时会根据指针所指向的对象调用相应类的虚函数实现动态联编
更详细的说明你可以看一下虚函数表
virtual其实在程序的版本升级中都要用到,因为一个程序不是做的非常完美之后才把它投放到市场去让客户使用的,这样也不会发现程序的漏洞,另外也挣不到利润啦,所以每个程序都有一个升级的过程
visual由于可以使用new关键字来隐藏基类中的同名成员和方法外,还可以使用override来重写。使用它既可以保持与以前的版本实现兼容,又可以向后扩展。就拿NET来说吧:
vs2005 到 vs2008这就是一个升级的过程
在Object类中有一个ToString的虚方法,它在以后得继承Ojbect类的子类中就可以重写ToString了。其实这就是一个多态的问题了。是NET的一个亮点哦!当然招聘的同志会问你这个啦!
作用:虚函数的作用就是将接口(函数调用)与实现(函数定义)分开, 就是实现所谓的多态行为。也就是说虚函数提供了让你修改基类函数定义的机会。这里虽然你定义了一个派生类但是这个派生类任然可以按照基类的方式使用,即将派生类对象传递给需要基类引用、指针的函数。
定义: 在一个类中,一个由virtual 关键字修饰的函数声明表示这个函数声明所对应的函数调用既要服务于本类中的函数定义也要服务于派生类中的函数定义,相当于一个接口的作用。
一段良好的代码通常只使用基类提供的接口来编写,那些与派生类相关的代码单独放在一个地方(工厂)。
例子:
class Window {
public:
virtual void drawEvent(void event); /
virtual void keyEvent(void event);
virtual void mouseEvent(void event);
virtual void addWindow(Window window);
void show();
virtual ~Window(); // 用到继承, 基类的析构函数必须声明为虚函数,否则是逻辑错误
};
class Button : public Window {
public:
// 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为
void drawEvent(void event);
void keyEvent(void event);
void mouseEvent(void event);
void setText(const std::string label);
};
class Menu;
class MenuBar : public Window {
public:
// 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为
void drawEvent(void event);
void mouseEvent(void event);
void addWindow(Window m);
};
class Menu : public Window {
public:
// 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为
void drawEvent(void event);
void mouseEvent(void event);
void keyEvent(void event);
};
void userCode(Window &win, Window &win2) {
winaddWindow(win2); //用户代码只用到了基类的引用
}
int main() {
Window mainWindow();
MenuBar menuar();
Menu fileMenu();
Button button();
usrCode(mainWindow, menuBar); //将MenuBar对象当做Window引用来使用,由于定义了虚函数,所以usrCode会使用我们重定义的代码
usrCode(menuBar, fileMenu); //
usrCode(mainWindow, button); //
mainWindowshow();
}
C++中虚函数的作用:
1、简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。
2、实现多态性,多态性是将接口与实现进行分离。
3、当基类指针指向一个子类对象,通过这个指针调用子类和基类同名成员函数的时候,基类声明为虚函数就会调子类的这个函数,不声明就会调用基类的。
C++中虚函数的用法:
1、比如你有个游戏,游戏里有个虚基类叫「怪物」,有纯虚函数 「攻击」。
2、派生出了三个子类「狼」「蜘蛛」「蟒蛇」,都实现了自己不同的「攻击」函数,比如狼是咬人,蜘蛛是吐丝,蟒蛇把你缠起来。
3、出现好多怪物的时候就可以定义一个 虚基类指针数组,把各种怪物的指针给它,然后迭代循环的时候直接 monster[i]->attack() 攻击玩家就行了,大概见下图:
扩展资料:
使用虚函数的注意事项:
1、包含虚函数的类指针列表会增大。
2、虚析构函数
(1)析构函数的作用是在对象撤销之前做必要的“清理现场”的工作。
(2)当派生类的对象从内存中撤销的时候,会先先调用派生类的析构函数然后再调用基类的析构函数。
(3)当我们new一个临时对象时,若基类中包含析构函数,并且定义了一个指向该基类的指针变量。
3、构造函数不能声明为虚函数
构造函数不能声明为虚函数。如果声明为虚函数,编译器会自动报出。
4、不在析构或者构造过程中调用虚函数
在析构函数或者是构造函数中,我们绝对不能调用虚函数。即使,我们在构造函数或者析构函数中调用虚函数,也不会下降至派生类中调用函数。
虚函数—
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)