金沙4787官网-澳门金沙4787.com|www.4787.com【官方网站】

您的位置:金沙4787官网 > 教育资讯 > 构造函数为什么不可以声明为虚函数?

构造函数为什么不可以声明为虚函数?

2019-10-15 03:49

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错.

  子类继承了父类的public方法以后,当然可以在public中添加新的方法和属性(属性一般放在private或者protect里面),这是继承的基本用法哦

  展开全部因为当一个构造函数被调用时,它做的首要的事情之一是初始化它的VPTR。

  因此,它只能知道它是“当前”类的,而完全忽视这个对象后面是否还有继承者。当编译器为这个构造函数产生代码时,它是为这个类的构造函数产生代码——既不是为基类,也不是为它的派生类(因为类不知道谁继承它)。所以它使用的VPTR必须是对于这个类的VTABLE。

  而且,只要它是最后的构造函数调用,那么在这个对象的生命期内,VPTR将保持被初始化为指向这个VTABLE, 但如果接着还有一个更晚派生的构造函数被调用,这个构造函数又将设置VPTR指向它的 VTABLE,等.直到最后的构造函数结束。

  但是,当这一系列构造函数调用正发生时,每个构造函数都已经设置VPTR指向它自己的VTABLE。如果函数调用使用虚机制,它将只产生通过它自己的VTABLE的调用,而不是最后的VTABLE(所有构造函数被调用后才会有最后的VTABLE)。

  展开全部虚函数的意思就是开启动态绑定,程序会根据对象的动态类型来选择要调用的方法。然而在构造函数运行的时候,这个对象的动态类型还不完整,没有办法确定它到底是什么类型,故构造函数不能动态绑定。(动态绑定是根据对象的动态类型而不是函数名,在调用构造函数之前,这个对象根本就不存在,它怎么动态绑定?)

  如果要保留原来函数的功能,并且还要新添功能的话,可以在子类重载父类的这个函数,并在子类的这个函数中,通过“父类::函数名()”先调用父类的版本,然后再在后面加自己的东西。

本文链接:构造函数为什么不可以声明为虚函数?