构造函数为什么不可以声明为虚函数?
发布网友
发布时间:2022-04-30 15:46
我来回答
共4个回答
热心网友
时间:2022-06-26 16:57
因为当一个构造函数被调用时,它做的首要的事情之一是初始化它的VPTR。
因此,它只能知道它是“当前”类的,而完全忽视这个对象后面是否还有继承者。当编译器为这个构造函数产生代码时,它是为这个类的构造函数产生代码——既不是为基类,也不是为它的派生类(因为类不知道谁继承它)。所以它使用的VPTR必须是对于这个类的VTABLE。
而且,只要它是最后的构造函数调用,那么在这个对象的生命期内,VPTR将保持被初始化为指向这个VTABLE, 但如果接着还有一个更晚派生的构造函数被调用,这个构造函数又将设置VPTR指向它的 VTABLE,等.直到最后的构造函数结束。
VPTR的状态是由被最后调用的构造函数确定的。
这就是为什么构造函数调用是从基类到更加派生类顺序的另一个理由。
但是,当这一系列构造函数调用正发生时,每个构造函数都已经设置VPTR指向它自己的VTABLE。如果函数调用使用虚机制,它将只产生通过它自己的VTABLE的调用,而不是最后的VTABLE(所有构造函数被调用后才会有最后的VTABLE)。
热心网友
时间:2022-06-26 16:58
没有想过语法为什么这么定义,不过实际中确实有这种需求,实现的方法是工厂模式(Factory)。
热心网友
时间:2022-06-26 16:58
构造函数不能声明为虚函数的原因是:
所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错.
------
子类继承了父类的public方法以后,当然可以在public中添加新的方法和属性(属性一般放在private或者protect里面),这是继承的基本用法哦
热心网友
时间:2022-06-26 16:59
虚函数的意思就是开启动态绑定,程序会根据对象的动态类型来选择要调用的方法。然而在构造函数运行的时候,这个对象的动态类型还不完整,没有办法确定它到底是什么类型,故构造函数不能动态绑定。(动态绑定是根据对象的动态类型而不是函数名,在调用构造函数之前,这个对象根本就不存在,它怎么动态绑定?)
如果要保留原来函数的功能,并且还要新添功能的话,可以在子类重载父类的这个函数,并在子类的这个函数中,通过“父类::函数名()”先调用父类的版本,然后再在后面加自己的东西。