2016 - 2024

感恩一路有你

多态的实现方式 构造函数为什么不可以声明为虚函数?

浏览量:2501 时间:2021-03-12 07:17:52 作者:admin

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

前面的回答都很靠谱的提到了重点:只有虚函数才会出现在虚函数表里;而且虚函数表里的项的顺序并不保证跟类里虚函数的声明顺序一致。编译器实现和ABI有决定vtable layout的自由。

C 的类的构造函数永远不是虚的。它只应该在两种场景使用,

  • 在new表达式中被调用:new表达式 = operator new调用 构造函数调用。这里总是指定某个特定的类来new的,整个行为不会多态,所以也没有让它成为虚函数的必要性。
    • 不过确实有时候大家会希望根据构造的参数的不同而实质上选择某个子类来new。这种需求常常通过工厂函数(factory function)来解决。
  • 被子类的构造器的初始化列表调用。C 里类继承关系是静态确定的,子类永远知道自己的基类是哪些,所以这个调用也不可能是虚的。

析构函数则可能是虚的。跟构造与析构是对称的过程,也正因为如此所以一个不会为虚而另一个可能为虚:
  • 构造:以new表达式为例,这是从一个非多态的信息到一个可多态的指针的操作
  • 析构:以delete表达式为例,这是一个从可多态的指针要找到具体类型信息的操作

===========================================

至于如何在程序里找出构造函数和析构函数的地址。构造函数的地址是肯定不会出现在vtable里的了。那咋搞?

题主给问题打上了逆向工程的标签,而且看来环境是MSVC,那如果目标文件里还有符号表的话,其实最直观的办法就是去符号表里把构造函数的decorated name对应的地址项找出来。具体咋操作还得看题主到底是在什么条件下需要找出这个地址来做什么。

为什么构造函数不能是虚函数?

构造函数不能声明为虚函数的原因是:所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错.------子类继承了父类的public方法以后,当然可以在public中添加新的方法和属性(属性一般放在private或者protect里面),这是继承的基本用法哦

为何构造函数不能成为虚函数?

构造函数的左右就是初始化变量等的值, VC 的语法是,只要用户定义了构造函数,系统就不会提供任何构造函数 如果将他定义成虚函数,程序初始的时候不能初始化变量,不能申请内存空间,程序会无法运行

多态的实现方式 析构函数不能是虚函数 malloc和new的区别

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。