博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么构造函数不能声明为虚函数?
阅读量:4114 次
发布时间:2019-05-25

本文共 1023 字,大约阅读时间需要 3 分钟。

自己总结:

1.当创建一个子类对象时,如果将构造函数声明为虚函数,因为子类在构造时,会先调用父类的够造函数,但是子类已经覆盖了基类的构造函数(因为是虚函数),所以也就无法进一步执行,导致程序出错。

2.虚函数需要通过虚函数指针指向一个虚函数表,当将构造函数声明为虚函数,在创建对象时,首先要调用构造函数,然后构造函数是虚函数,就需要用虚函数指针去调用,但是,对象都还没构造,也就没有虚函数指针,造成了一个矛盾的问题。

 

参考资料:

  虚函数可谓是C++与其它的面向对象语言最大的区别了。虚函数的存在使为了多态,当然也有多态。不过实现方式并不是通过虚函数,我们这里就不做介绍了。

        虚函数的作用主要是为了继承的时候,子类通过继承虚函数的接口,而实现子类自定义的函数接口,我们通过虚函数表的方式寻找到子类对应的接口。从而实现,一个接口多种实现方式的多态功能。

      那么,有一个问题,构造函数是否能够设置为虚函数?答案是否定的。但是为什么呢?构造函数之所以不能设置成虚函数,主要有以下的几个原因。下面分别阐述一下。

      1.虚函数的作用是什么?是实现部分或默认的功能,而且该功能可以被子类所修改。如果父类的构造函数设置成虚函数,那么子类的构造函数会直接覆盖掉父类的构造函数。而父类的构造函数就失去了一些初始化的功能。这与子类的构造需要先完成父类的构造的流程相违背了。而这个后果会相当严重。

      2.虚函数的调用是需要通过“虚函数表”来进行的,而虚函数表也需要在对象实例化之后才能够进行调用。在构造对象的过程中,还没有为“虚函数表”分配内存。所以,这个调用也是违背先实例化后调用的准则。

      3.虚函数的调用是由父类指针进行完成的,而对象的构造则是由编译器完成的,由于在创建一个对象的过程中,涉及到资源的创建,类型的确定,而这些是无法在运行过程中确定的,需要在编译的过程中就确定下来。而多态是在运行过程中体现出来的,所以是不能够通过虚函数来创建构造函数的,与实例化的次序不同也有关系。

    那么虚够函数为什么可以设计成虚函数呢?由于虚函数是释放对象的时候才执行的,所以一开始也就无法确定析够函数的。而去由于析构的过程中,是先析构子类对象,后析构父类对象。所以,需要通过虚函数来指引子类对象。所以,如果不设置成虚函数的话,析构函数是无法执行子类的析构函数的

   所以,基于以上几点原因,构造函数是不能够设置成虚函数的,而析构函数是要设置成虚函数的。而且这个也是面试中会经常提及的考点。

转载地址:http://bogsi.baihongyu.com/

你可能感兴趣的文章
层在页面中的定位
查看>>
[转]C语言printf
查看>>
C 语言 学习---获取文本框内容及字符串拼接
查看>>
C 语言学习 --设置文本框内容及进制转换
查看>>
C 语言 学习---判断文本框取得的数是否是整数
查看>>
C 语言 学习---ComboBox相关、简单计算器
查看>>
C 语言 学习---ComboBox相关、简易“假”管理系统
查看>>
C 语言 学习---回调、时间定时更新程序
查看>>
C 语言 学习---复选框及列表框的使用
查看>>
第四章 - 程序计数器
查看>>
第七章 - 本地方法栈
查看>>
第十一章 - 直接内存
查看>>
JDBC核心技术 - 上篇
查看>>
JDBC核心技术 - 下篇
查看>>
一篇搞懂Java反射机制
查看>>
【2021-MOOC-浙江大学-陈越、何钦铭-数据结构】树
查看>>
MySQL主从复制不一致的原因以及解决方法
查看>>
RedisTemplate的key默认序列化器问题
查看>>
序列化与自定义序列化
查看>>
ThreadLocal
查看>>