c++基础五个题(三)

一。一个对象访问普通函数和虚函数的时候,哪一个更快?

    访问普通函数更快,因为普通成员函数在编译阶段已经被确定,因此在访问时直接调用对应地址的函数,而虚函数在调用时,需要首先在虚函数表中查找虚函数所在的地址,因此比普通函数要慢一些。

二。什么情况之下,需要析构函数是虚函数?

    首先存在类继承并且析构函数确实析构了一些资源,这样当父类指针指向子类对象时,析构的时候只会释放父类的析构函数,而不会调用子类的析构函数,这样就会造成内存泄露。

三。内联函数,构造函数,静态成员函数可以是虚函数吗?

     都不可以,内联函数需要在编译阶段展开,但是虚函数是在运行时动态绑定的,编译时无法展开,构造函数在进行调用时还不存在父类与子类的概念,父类只会调用父类的构造函数,子类调用子类的,因此不存在动态绑定的概念,静态成员函数是以类为单位的函数,与具体对象无关(无this指针),虚函数是与对象的动态绑定,因此是两个不冲突的概念。

四。构造函数可以调用析构函数吗?

    可以调用,但是并没有任何意义,父类调用的仍然是父类版本的构造函数,子类调用的是子类版本的构造函数。

五。c++中虚继承的作用以及底层实现原理

    虚继承:顾名思义就是在被继承的类前面加上virtual关键字,这时候被继承的类称为虚基类。例如:

  class base;

  class b1:virtual public base;

  class b2:virtual public base;

  class b3:public b1,public b2;

           以上用到了base中的某个成员就不会产生二义性。一般通过虚基类指针实现,即各对象中只保存一份父类的对象,多继承时通过虚基类指针引用该公共对象,从而避免了菱形继承中二义性问题。

  1.上例b3保存的就是b2对象的值,如果class b3:public b2,public b1;保存的就是b1对象的值

  2.如果去掉virtual那么编译出错,提示二义性错误