由于在学习QT的时候,涉及到了虚函数的,在网上查看了别人的博客,在这里进行总结:
先看 下虚函数的定义:
在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,virtual 函数返回类型 函数名(参数表) {函数体;},实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数
看一个简单的例子来进行说明:
1 #include "stdio.h"
2 class Parent
3 {
4 public:
5
6 char data[20];
7 void Function1();
8 virtual void Function2(); //声明Function2为虚函数
9 }parent;
10
11 void Parent::Function1()
12 {
13 printf("this is parent,function1\n");
14 }
15
16 void Parent::Function2()
17 {
18 printf("this is parent,function2\n");
19 }
20
21 class Child::public Parent
22
23 {
24 void Function1();
25
26 void Function2();
27
28 }child;
29
30 void Child::Function1()
31 {
32 printf("this is child,function1");
33 }
34
35
36 void Child::Function2()
37 {
38 printf("this is child,function2");
39 }
40
41
42 int main()
43 {
44 Parent *p; //定义一个基类指针
45 if(_getch()=='c') //如果输入一个小写字母c
46
47 p=&child; //指向继承类对象
48
49 else p=&parent; //否则指向基类对象
50
51 p->Function1();
52
53 p->Function2();
54
55 return 0;
56 }
View Code
当编译程序后,输入小写字母c后,打印的结果是:
this is parent,function1
this is child,function2
解释:在主函数中,定义了一个parent类的指针,该指针的赋值是child类,所以指针指向child对象。
虽然指针指向了child类的对象,但是编译器无法知道指针到底是指向那个对象,直到程序运行的时候,函数才能够根据用户的输入来能判断出来指针的正确指向。
在本程序运行的时候,并未涉及到用户的输入指定,所以指针默认的去调用主类parent的成员函数。
this is parent,function1
在主类的parent的成员函数中,声明Function2()是虚函数,虚函数可以在运行时,自动的去判断指针的正确指向,而不需要人为的输入进行指定。所以运行的结果正确
地调用子类child的成员函数。
总结:
若对主类的成员函数设置为虚函数,必须显示的写出关键词virtual,子类的虚函数必须和主类的虚函数同名,但是关键词virtual可以省略。
虚函数一般是在涉及到类的继承和多态性的时候应用,常见的地方在图像界面开发QT或者MFC。图像化界面的控件好多都是继承的关系。