C++学习之对象模型

1,C++对象模型参见文章:

  http://www.cnblogs.com/skynet/p/3343726.html

  http://blog.csdn.net/l09711/article/details/6396621

2,构造函数为什么不能是虚函数

  1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。
  2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。
3,虚函数与非虚函数对比
  使用虚函数是有代价的,在内存和执行速度方面是有一定成本的,包括:

    l  每个对象都将增大,增大量为存储虚函数表指针的大小;

    l  对于每个类,编译器都创建一个虚函数地址表;

    l  对于每个函数调用,都需要执行一项额外的操作,即到虚函数表中查找地址。

  虽然非虚函数比虚函数效率稍高,单不具备动态联编能力

原文地址:https://www.cnblogs.com/theCambrian/p/3345873.html