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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么构造函数不能是虚函数相关的知识,希望对你有一定的参考价值。

首先,我写了一个构造函数用virtual修饰的类A,代码如下:

class A
{
public:
	virtual A()
	{}
};

运行结果:(我是在VS下运行的)

技术分享

可以看出这样的代码编译时是有问题的。


为什么构造函数不能是虚函数呢?

这里你需要知道一个概念,那就是虚函数表vtbl,每一个拥有虚成员函数的类都有一个指向虚函数表的指针。对象通过虚函数表里存储的虚函数地址来调用虚函数。

那虚函数表指针是什么时候初始化的呢?当然是构造函数。当我们通过new来创建一个对象的时候,第一步是申请需要的内存,第二步就是调用构造函数。试想,如果构造函数是虚函数,那必然需要通过vtbl来找到虚构造函数的入口地址,显然,我们申请的内存还没有做任何初始化,不可能有vtbl的。因此,构造函数不能是虚函数。


本文出自 “学习记录” 博客,请务必保留此出处http://10794428.blog.51cto.com/10784428/1888291

以上是关于为什么构造函数不能是虚函数的主要内容,如果未能解决你的问题,请参考以下文章

什么函数不能是虚函数?为什么析构必须是虚函数?

什么函数不能是虚函数?为什么析构必须是虚函数?

构造函数和析构函数可以是虚函数吗

构造函数和析构函数可以是虚函数吗

构造函数不能为虚函数

C++&C面试题100道分析(61-80)