您的位置:首页 > 编程语言 > C语言/C++

C/C++—— C++中构造函数不能是虚函数的原因分析

2016-04-04 14:08 330 查看

首先:到底能不能将构造函数声明为虚函数?

答案是不能。先看下面例子的编译结果。

#include <iostream>
using namespace std;

class Parent
{
public:
virtual Parent(int a = 0)
{
this->a = a;
}

virtual void print()
{
cout<< "Parent." <<endl;
}
private:
int a;
};

class Child : public Parent
{
public:
Child(int b = 0)
{
this->b = b;
}
virtual void print()
{
cout<< "Child."<<endl;
}
private:
int b ;
};

int main()
{
Parent p;

return 0;
}


编译输出结果:

error: constructors cannot be declared virtual [-fpermissive]

virtual Parent(int a = 0)

提示构造函数不能声明为虚函数。。

分析原因:

首先参考博客:C/C++—— C++编译器是如何实现多态

先了解vptr指针和虚函数表的概念,以及两者的关系。

vptr指针指向虚函数表,执行虚函数的时候,会调用vptr指针变量指向的虚函数表中的虚函数。

当定义个对象的时候,首先会分配内存空间,然后再执行构造函数对该对象进行初始化构造。vptr变量是在构造函数中进行初始化的。又因为要想执行虚函数必须通过vptr变量找到虚函数表。(在构造函数初始化vptr变量之前是不会调用虚函数的)如果可以定义虚构造函数,就陷入了先有鸡还是先有蛋的问题。

所以不能将构造函数声明为虚函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: