C/C++错题集之虚函数相关

  1. 静态多态性:编译期间确定具体执行哪一项操作,主要是通过函数重载和运算符重载来实现的; 
    动态多态性:运行时确定具体执行哪一项操作,主要是通过虚函数来实现的。
  2. 如果类中含有虚函数,则编译器需要为类构建虚函数表,类中需要存储一个指针指向这个虚函数表的首地址,注意不管有几个虚函数,都只建立一张表,所有的虚函数地址都存在这张表里,类中只需要一个指针指向虚函数表首地址即可。 
  3. 虚继承的作用是什么? 
    在多继承中,子类可能同时拥有多个父类,如果这些父类还有相同的父类(祖先类),那么在子类中就会有多份祖先类。例如,类B和类C都继承与类A,如果类D派生于B和C,那么类D中就会有两份A。为了防止在多继承中子类存在重复的父类情况,可以在父类继承时使用虚函数,即在类B和类C继承类A时使用virtual关键字,例如: 
    class B : virtual public A 
    class C : virtual public A 
    注:因为多继承会带来很多复杂问题,因此要慎用。
  4. 父类和子类定义了同名的函数就是函数的隐藏

        子类继承父类的虚函数就是函数的覆盖

  5. 虚函数表占用4个字节内存

  6. 继承抽象类时,如果没有对纯虚函数重新定义,则子类也是抽象类

  7. 仅含有纯虚函数的类是接口类,没有数据成员,只有纯虚成员函数

  8. 静态联编与动态联编:如果是通过对象名调用虚函数,在编译期间就能确定调用的是哪一个类的虚函数,所以属于静态关联;如果是通过基类指针调用虚函数,在编译阶段无法从语句本身确定调用哪一个类的虚函数,只有在运行时,pt指向某一个类对象后,才能确定调用的是哪一个类的虚函数,故为动态关联

  9. 重载:只有在同一个类定义中的同名成员函数才存在重载关系,主要特点是函数的参数类型和数目有所不同,但不能出现函数参数的个数和类型均相同,重载和成员函数是否是虚函数无关

        覆盖:在派生类中覆盖基类中的同名函数,要求两个函数的参数个数、参数类型、返回类型都相同,且基类函数必须是虚函数。

        隐藏:派生类中的函数屏蔽了基类中的同名函数,两个函数参数相同,但基类函数不是虚函数(和覆盖的区别在于基类是否是虚函数)。两个函数参数不同,无论基类函数是否是虚函数,基类函数都会被屏蔽(和重载的区别在于两个函数不在同一个类中)。

  10. 构造函数不能是虚函数,析构函数可以是虚函数

  11. 以下哪些做法是不正确或者应极力避免的:A,C,D

    A、构造函数声明为虚函数

    B、派生关系中的基类析构函数声明为虚函数

    C、构造函数中调用虚函数

    D、析构函数中调用虚函数

  12. 虚函数必须是类的成员函数,其中类的静态成员函数和构造函数不能定义为虚函数,析构函数可以

  13. 使用对象名调用虚函数,是静态联编;

    使用基类指针调用虚函数,是动态联编

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值