构造函数不能为虚函数

构造函数不能声明为虚函数的原因:

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

class A
{
      public :
      virtual A()
      {
             cout      }
             
};
class B: public A
{
      public: 
      B()
      {
             cout      }

      
};

在编译处,便已经提示无法通过,将virtual去掉

2,虚函数的主要意义在于被派生类继承从而产生多态,派生类的构造函数中,编译器会加入构造基类的代码,如果基类的构造函数用到了参数,则派生类在其构造函数中必须为基类给出参数,就是这个原因,原因有点绕,就是说如果派生类的构造函数必须跟父类一摸一样,这显然是不符合实际的

当然还有其他的解释:1,从存储空间角度,虚函数对应一个vtable,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的就需要通过vtable来调用,可是对象还没有实例化,也就是内存空间还,没有,无法找到vtable,所以构造函数不能为虚函数。

2,从使用角度 虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也就没有实例意义了,最开始的实例都没有初始化,何来多态呢。虚函数的作用于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数实在创建对象的时候自动调用的,不可能通过父类的指针或引用去调用,因此规定构造函数不能为虚函数。

3,从实现上看,vtable在构造函数调用后才建立,因而构造函数不可能为虚函数,从实际含义上看,在调用构造函数时还不能确定对象的真实类型(子类要调用父类的构造函数),而且构造函数提供初始化,对象生命期只执行一次,不是对象的动态行为,也没有太大必要成为虚函数。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2553879.html

(0)
上一篇 2025年3月6日 06:51:33
下一篇 2025年2月18日 12:42:46

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 用C#生成不重复的随机数 – asp.net 教程

    我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.net framework中提供了一个专门用来产生随机数的类system.random。  对于随机数,大家都知道,计算机不 可能产生完全随机的数字,所谓的随机数发生…

    编程技术 2025年3月6日
    200
  • c#.net常用的小函数和方法集

    1、datetime数字型system.datetime currenttime=new system.datetime();1.1取当前年月日时分秒currenttime=system.datetime.now;1.2取当前年int年=c…

    编程技术 2025年3月6日
    200
  • ADO.NET调用存储过程

    一: 执行不带返回参数(input)的存储过程1: 首先在数据库写个存储过程, 如创建个 adduser存储过程。create proc adduser@id int,@name varchar(20),@sex varchar(20)as…

    编程技术 2025年3月6日
    200
  • asp.net下检测SQL注入式攻击代码

    两个类:(页面数据校验类)pagevalidate.cs基本通用。代码如下: 使用系统; 使用System.Text; 使用的System.Web; 使用System.Web.UI.WebControls; 使用System.Text.Re…

    编程技术 2025年3月6日
    200
  • .NET 中的三种接口实现方式

    一般来说.net提供了三种不同的接口实现方式,分别为隐式接口实现、显式接口实现、混合式接口实现。这三种方式各有各的特点。 首先来看隐式接口实现,这恐怕是我们使用最多的一种接口实现,因为隐匿接口实现是.NET的默认接口实现方式。下面让我们来看…

    编程技术 2025年3月6日
    200
  • 为 Jenkins 配置 .NET 持续集成环境

    去年年底,得益于公司引入 jenkins,让我们在持续集成方面迈出了第一步,本文不赘述如何安装 jenkins,主要关注点在于配置 .net 环境。另外本文是在 windows 环境下安装的 jenkins 进行操作。 一、安装环境 首先我…

    2025年3月6日
    200
  • C# 中 10 个你真的应该学习(和使用!)的功能

    如果你开始探索c#或决定扩展你的知识,那么你应该学习这些有用的语言功能,这样做有助于简化代码,避免错误,节省大量的时间。    1)async / await 使用async / await-pattern允许在执行阻塞操作时解除UI /当…

    编程技术 2025年3月6日
    200
  • Memcached在.net中的应用

    一,服务端的安装及配置 1)        解压缩文件到c:memcached(也可以选择任意位置) 2)        命令行输入 ‘c:memcachedmemcached.exe -d install’ 3) …

    2025年3月6日 编程技术
    200
  • .Net配置文件——统一节点配置管理

           对于.net中的自定义节点,如果要单独处理,就要为这个节点添加一个指定的类,如果我们在一个应用程序中,定义了很多个自定义节点的话,还按照这样做,就会多出很多个处理类来,为了避免太多的类,我们将所有自定节点都指定一个自定义节点作…

    编程技术 2025年3月6日
    200
  • C#.Net操作注册表RegistryKey

    看看registrykey的帮助就知道了,这个东西不复杂,比如: 1、加键加值  string appName = “PowerOffOnTime”;//获取执行该方法的程序集,并获取该程序集的文件路径(由该文件路径可以得到程序集所在的目录…

    2025年3月6日 编程技术
    200

发表回复

登录后才能评论