虚函数小记



  • 虚函数

    • 虚成员函数和动态联编:
      BrassPlus为一个子类,Brass为基类
      BrassPlus ope;
      Brass*bp;
      bp = &ope;
      bp->viewAcct();  //viewAcct()在基类和子类中实现不同
      //如果在基类中没有将viewAcct()声明为虚的,则bp->viewAcct()将根据指针类型(Brass*)调用Brass::ViewAcct(),所以编译器对非虚方法使用静态联编。
      //然而如果在基类中将viewAcct()声明为虚的,则bp->ViewAcct()将根据对象类型(BrassPlus)调用BrassPlus::ViewAcct().即编译器对虚方法采用动态联编
      
      (1)如果要在派生类中重新定义基类的方法,则将它设置为虚方法;否则,设置为非虚方法
      (2)虚函数工作原理:编译器处理虚函数的方法:给每个对象添加一个隐藏成员。隐藏成员中保存了一个指向函数地址数组的指针。这种数组成为虚函数表(vtbl)。虚函数表中存储了为类对象进行声明的虚函数的地址。
      
    • 虚函数的一些其他知识:

      • 构造函数不能是虚函数
      • 析构函数应当是虚函数,除非类不用做基类 virtual ~BaseClass(){}
      • 通常应给基类提供一个虚析构函数,即使它并不需要析构函数
      • 友元不能是虚函数,因友元不是类成员,而只有成员才能是虚函数
      • 如果重新定义继承的方法,应确保与原来的原型完全相同,但如果返回类型是基类引用或指针,则可以修改为指向派生类的引用和指针
      • 如果基类声明被重载了,则应在派生类中重新定义所有的基类版本
    • 访问控制:protected
      与private类似,在类外只能用公有类成员来访问protected部分中的类成员。但派生类的成员可以直接访问基类的保护成员,但不能直接访问基类的私有成员
      //最好对类数据成员采用私有访问控制,不要使用保护访问控制
      

 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

Looks like your connection to Dian was lost, please wait while we try to reconnect.