zoukankan      html  css  js  c++  java
  • 虚函数的用法

    由于在学习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
    ");
    14 }
    15 
    16 void Parent::Function2()
    17 {
    18     printf("this is parent,function2
    ");
    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。图像化界面的控件好多都是继承的关系。

  • 相关阅读:
    Azure ARM模式下VNet配置中需要注意的几点事项
    scala的传名参数
    scala中如何编写自定义的流程控制结构
    scala打印九九乘法表的5种实现
    kakfa源码编译打包
    kakfa的常用命令总结
    kafka单节点部署无法访问问题解决
    ubuntu下安装gradle
    ubuntu14.04LTS 下storm单机版安装配置
    Mybatis-Generator使用
  • 原文地址:https://www.cnblogs.com/ccnp/p/3899719.html
Copyright © 2011-2022 走看看