由于在学习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 Parent22 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') //如果输入一个小写字母c46 47 p=&child; //指向继承类对象48 49 else p=&parent; //否则指向基类对象50 51 p->Function1();52 53 p->Function2(); 54 55 return 0;56 }
当编译程序后,输入小写字母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。图像化界面的控件好多都是继承的关系。