Skip to content

面试必考之多态与虚函数

Posted in 未分类

这种知识真的是一段时间不用就忘,还是记录一下吧

  1. 在构造函数和析构函数中调用虚函数不可取,他们都不是动态绑定的;new B的时候永远要先调A的构造函数(包括其虚函数)再调B的。 这一切是因为vptr的绑定是发生在对象构造期间的,所以构造函数会有这样一个假设: 我正在构造的对象和我的类型是完全一致的, 同理虚析构函数也会这么假设。所以在构造/析构函。数中调用virtual 函数时不会有任何多态效果的。
  2. 多态概括:C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。(这里我觉得要补充,重写的话可以有两种,直接重写成员函数和重写虚函数,只有重写了虚函数的才能算作是体现了C++多态性)最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。
  3. 重写是相同参数表,重载是函数名相同参数表不完全相同
  4. melloc,free 和 new,delete区别?首先申请内存所在位置不同,众所周知malloc在stack上分配内存,而new在free store区域,可以是stack也可以是static。而且new是类型安全的,而用malloc分配的空间返回的实质上是void*,通过强制类型转换变为我们需要的类型。其次,malloc需指定分配空间大小(sizeof)而new自动计算,new和delete调用构造函数和析构函数等

PS:都开始实习了还是答应了别的公司的面试orz,为什么我总是给自己寻找痛苦。。。

One Comment

  1. (  ̄▽ ̄)σ 折磨自己

    2019年6月11日
    |Reply

发表评论

电子邮件地址不会被公开。