虚函数

  1. 哪些函数可以设为虚函数,哪些不可以,为什么

    解析:普通函数(非成员函数),构造函数,内联成员函数、静态成员函数、友元函数。

    (一)虚函数用于基类和派生类,普通函数不能

    原因:虚函数存在的意义就是为了实现动态的多态。

    多态:多态可简单概括为“一个接口,多种方法”多态性又分为静态多态性和动态多态性。

    静多态:函数重载,运算符重载,模板属于静态多态性;  程序调用函数时,具体应使用哪个代码块是由编译器决定的。以函数重载为例,编译器根据传递给函数的参数和函数名决定具体要用哪个函数,成为联编或绑定。在编译过程中进行的联编叫静态联编。               动多态:虚函数属于动态多态性。 同样在调用函数时,在某些情况下,编译器无法在编译过程中完成联编,必须在程序运行时完成动态的选择,因此编译器必须提供一套成为“动态联编”(dynamic bining)的机制。通过虚函数来实现动态联编。因此虚函数是为了实现动态机制,而动态又体现在派生类和基类之间。所以普通函数是不能成为虚函数的。

    知识点补充:

    同名函数关系:

    函数重载:相同作用域下,函数名称相同参数列表不同

    隐藏:不同作用域下,当派生类与基类有相同的同名函数时(形参可以相同也可以不同)派生类将基类隐藏。

    覆盖 :不同作用域下,基类中有一个虚函数,派生类也有与其同名的函数,并且该函数的返回值,函数名,参数列表都与基类相同,派生类就会覆盖基类 。

  2. 1.基类中有虚函数,派生类有与其同名的函数          

  3. 基类中没有虚函数,派生类中有虚函数
         
  4. 构造函数不能是因为虚函数采用的是虚调用的方法

    因为虚函数采用的是虚调用的方法,虚调用是指允许在只知道部分信息的情况下的工作机制,特别允许我们调用一个只知道接口而不知道其对象的准确类型的函数。

    但是如果我们要调用构造函数创建对象时,必须要知道对象的准确类型,

    因此构造函数不能为虚函数。

     

    能成为虚函数的最基础的条件是

  5. 可以取地址。因为虚函数表记录着虚函数的地址,不能取地址的函数就无法记录在虚函数表里,就无法成为虚函数。
  6. 必须要有对象。因为建立对象的时候才会建立虚函数表,没有对象就没有虚函数表,没有虚函数表就不能成为虚函数。
    而构造函数函数是为了构造对象的,调用他之前对象还没有创建好 ,所以构造函数没有对象是不能成为虚函数。
     
     
     
  7. 析构函数可以成为虚函数
    调用析构函数时有对象也能够取地址。所以析构函数可以成为虚函数。
     
    虚析构函数
         首先派生类的指针不能指向基类对象,因为基类并没有派生类一些数据,所以派生类无法指向基类。但基类的指针可以指向派生类,但不可以操作做派生类有但基类没有的数据。
    因此当基类指针操作派生类对象时是没有问题的,但如果派生类在堆上开辟内存了,在销毁对象内存时则只执行基类的析构函数,派生类的析构函数却没有执行,导致派生类内存泄漏。
    解决办法就是虚析构函数,这样当需要销毁对象内存时,就可以动态的从虚函数表 选择 执行那个函数。防止内存泄漏。
    4内联成函数不能成为虚函数
    内联函数在函数调用时,把函数的代码在编译阶段展开,从而不产生函数调用的开销,不产生函数符号。而虚函数是运行时动态绑定的,编译时无法展开;
     
    (5)静态成员函数不能成为虚函数
    在继承过程中,静态成员函数是不被被继承的,所以它只属于一个类,不属于对象,调用时由类调用,不用对象调用。所以不能成为虚函数。
    (6)友元函数也不能成为虚函数
    友元函数不是类的成员函数,因此也不能被继承。原因和静态成员函数箱相同。
     
     
     
  8.  

     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值