首先,我写了一个构造函数用virtual修饰的类A,代码如下:
创新互联自2013年创立以来,是专业互联网技术服务公司,拥有项目成都做网站、成都网站建设、成都外贸网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元亚东做网站,已为上家服务,为亚东各地企业和个人服务,联系电话:18980820575
class A { public: virtual A() {} };
运行结果:(我是在VS下运行的)
可以看出这样的代码编译时是有问题的。
为什么构造函数不能是虚函数呢?
这里你需要知道一个概念,那就是虚函数表vtbl,每一个拥有虚成员函数的类都有一个指向虚函数表的指针。对象通过虚函数表里存储的虚函数地址来调用虚函数。
那虚函数表指针是什么时候初始化的呢?当然是构造函数。当我们通过new来创建一个对象的时候,第一步是申请需要的内存,第二步就是调用构造函数。试想,如果构造函数是虚函数,那必然需要通过vtbl来找到虚构造函数的入口地址,显然,我们申请的内存还没有做任何初始化,不可能有vtbl的。因此,构造函数不能是虚函数。