构造函数为什么不能被设置为虚函数
1.虚函数调用只需要“部分的信息”,即只需要知道函数的接口(函数返回类型,函数名,参数列表),而不需要对象的具体类型,但是构造一个函数的时候,必须知道具体的类型信息。如果你调用一个虚构造函数,编译器不知道你要构造的继承树上的那种类型。
- 1.构造函数的用途:创建对象,初始化对象中的属性,类型转化
- 2.再类中定义虚函数就会有一个虚函数表(vftable),对象模型中就就含有一个指向虚表的指针(_vfptr)。在定义对象时构造函数设置虚表指针指向虚函数表
- 3.使用指针和引用调用虚函数,在编译只需要知道函数接口,运行时指向对象,才能关联到具体对象的虚方法(通过虚函数指针查虚表得到具体对象中的虚方法)
- 4.构造函数是类的一个特殊成员:
1)定义对象由系统自动调用构造函数,对象自己是不可以调用构造函数;
2)构造函数的调用属于静态联编,在编译时就必须知道具体类型的信息 - 5.如果构造函数可以设置为虚函数,使用指针调用构造函数,如果编译器采用的静态联编,构造函数就不能为虚函数,如果编译器采用的是动态联编,运行时指针指向具体的对象,使用指针调用构造函数,相当于已经实例化的对象在调用构造函数,这是不允许调用,对象的构造函数只执行一次
- 6.如果指针可以调用构造函数,通过虚函数表,调动构造函数,那么,当指针为nullptr,如何查虚函数表呢?
- 7.构造函数是在编译时确定,如果是虚构造函数,编译器不知道构建的是继承树上的那种类型
析构函数为什么可以被设置为虚函数
- 当一个对象的生命周期结束时,系统会自动调用析构函数注销该对象并进行善后工作,对象自身也可以调用析构函数
- 析构函数的善后工作是:释放对象在生命期内获得的资源(如动态分配的内存,内核资源)
- 析构函数也用来执行对象即将被撤销之前的操作
在什么情况下析构函数必须为虚函数
根据赋值兼容性规则,可以用基类的指针指向派生类的对象,如果使用基类指针指向动态创建的派生类的对象,由该基类指针撤销派生类对象,则必须将析构函数设置为虚函数。