解析 解析:因为虚函数采用的是虚调用的方法,虚调用是指允许在只知道部分信息的情况下 的工作机制,特别允许我们调用一个只知道接口而不知道其对象的准确类型的函数。 但是如果我们要调用构造函数创建对象时,必须要知道对象的准确类型, 因此构造函数不能为虚函数。
现在构造函数是虚函数,就需要虚表,但是对象还没有实例化,也就是内存空间还没有,没办法通过vptr去找到vtable。所以构造函数不能是虚函数。 二、使用角度 虚函数一般是通过父类的指针或者引用来指向子类对象,从而在调用虚函数的时候可以调用到子类的那个成员函数。但是构造函数是在创建对象的时候自己主动调用的,不可能...
1.当创建一个子类对象时,如果将构造函数声明为虚函数,因为子类在构造时,会先调用父类的够造函数,但是子类已经覆盖了基类的构造函数(因为是虚函数),所以也就无法进一步执行,导致程序出错。 2.虚函数需要通过虚函数指针指向一个虚函数表,当将构造函数声明为虚函数,在创建对象时,首先要调用构造函数,然后构造函数是虚...
所以构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。 3. 构造函数不需要是虚函数,也不允许是虚函数,因为创建一个对象时我们总是要明确...
如果构造函数可以是虚函数,在对象构造尚未完成的过程中调用虚函数,会导致对象处于不一致或未初始化的状态。四、C++ 的设计选择 C++ 语言的设计者深知上述冲突,因此做出了一个合理的限制:构造函数不能是虚函数 。这确保了在对象创建过程中,基类的初始化是可控的,且不会因多态机制而导致未定义行为。事实上,C++...
一、构造函数为什么不能为虚函数 1. 从存储空间角度,虚函数相应一个指向vtable虚函数表的指针,这大家都知道,但是这个指向vtable的指针事实上是存储在对象的内存空间的。问题出来了,假设构造函数是虚的,就须要通过 vtable来调用,但是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数...
解析 因为构造函数不被继承,而虚函数是要在派生类中重定义的。定义虚析构函数后,由于多态,当使用基类指针指向派生类对象时,会调用派生类的虚构函数,然后派生类的析构函数自动调用基本析构函数。不是虚的话,直接调用基类的析构函数了。如果派生类中有用new分配的内存,就无法释放。
首先说一说构造函数不能够是虚函数的原因: 1、一个类有虚函数时,那么它就会对应着有一个虚表,这个虚表是存在在对象的内存空间的,所有虚函数的调用都要用到虚表,如果构造函数是虚的,那么他也就需要这个虚表来调用,但是这个时候没有执行构造函数,哪来的对象?也就是还没有分配内存空间,这个虚表你是找不到的,那么...
构造函数不能是虚函数,因为构造函数就是帮助完成对象初始化创建的,此时对象还没有完全生成,不能支持虚函数机制。虚函数的调用依赖于虚函数表,而指向虚函数表的指针需要在构造函数中进行初始化,所以构造函数无法定义为虚函数。 基类的析构函数需要定义为虚函数是为了实现动态绑定,基类指针指向派生类对象,如果析构函数不...