构造函数不能是虚函数
2017-05-31 21:51
162 查看
本文的主题是构造函数不能是虚函数,首先这不需要你用脑子去记,因为当你写出来虚构造函数时,编译器是能检查出来的。本文的目的是为什么构造函数不能是虚函数。
首先,先看一段错误的代码,下面的代码是通不过编译阶段的。
为什么构造函数不能是虚函数呢?这里你需要知道一个概念,那就是虚函数表vtbl,每一个拥有虚成员函数的类都有一个指向虚函数表的指针。对象通过虚函数表里存储的虚函数地址来调用虚函数。
那虚函数表指针是什么时候初始化的呢?当然是构造函数。当我们通过new来创建一个对象的时候,第一步是申请需要的内存,第二步就是调用构造函数。试想,如果构造函数是虚函数,那必然需要通过vtbl来找到虚构造函数的入口地址,显然,我们申请的内存还没有做任何初始化,不可能有vtbl的。因此,构造函数不能是虚函数。
首先,先看一段错误的代码,下面的代码是通不过编译阶段的。
1 class A{ 2 public: 3 virtual A(){ 4 this->value = 0; 5 } 6 private: 7 int value; 8 };
为什么构造函数不能是虚函数呢?这里你需要知道一个概念,那就是虚函数表vtbl,每一个拥有虚成员函数的类都有一个指向虚函数表的指针。对象通过虚函数表里存储的虚函数地址来调用虚函数。
那虚函数表指针是什么时候初始化的呢?当然是构造函数。当我们通过new来创建一个对象的时候,第一步是申请需要的内存,第二步就是调用构造函数。试想,如果构造函数是虚函数,那必然需要通过vtbl来找到虚构造函数的入口地址,显然,我们申请的内存还没有做任何初始化,不可能有vtbl的。因此,构造函数不能是虚函数。
相关文章推荐
- C++的构造函数为什么不能是虚函数
- 构造函数为什么不能是虚函数
- 内联函数,构造函数,静态函数都不能是虚函数
- 构造函数不能为虚函数,虚析构函数的作用
- 构造函数为什么不能是虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以声明为虚函数
- 构造函数不能为虚函数
- 为什么构造函数不能为虚函数
- 构造函数为什么不能是虚函数
- 为什么构造函数不能为虚函数
- 构造函数为什么不能是虚函数
- 【C++】构造函数不能是虚函数
- 构造函数为什么不能是虚函数
- 构造函数不能为虚函数
- 构造函数为什么不能是虚函数
- 虚表解析以及构造函数为什么不能是虚函数
- 构造函数不能为虚函数的原因
- 构造函数为何不能为虚函数
- C++中构造函数、static修饰函数、内联函数、友元函数不能是虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以