虚函数的用法

由于在学习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。图像化界面的控件好多都是继承的关系。

 

posted @ 2014-08-08 16:46  咖啡加牛奶  阅读(665)  评论(0编辑  收藏  举报