首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

构造函数中的虚函数,为什么语言不同?

构造函数中的虚函数是指在构造函数中调用虚函数。由于虚函数的多态性质,它们通常在派生类中被重写。当在构造函数中调用虚函数时,如果派生类还没有完全构造,可能会导致未定义的行为。

这个问题的原因是因为C++的构造函数和析构函数是特殊的成员函数,它们控制对象的创建和销毁。在构造函数中,对象的内存已经分配,但是派生类的成员变量和虚函数表还没有完全初始化。因此,在构造函数中调用虚函数可能会导致错误的行为。

为了避免这种情况,C++规定在构造函数中不能调用虚函数。如果在构造函数中调用虚函数,编译器可能会给出警告或错误信息。

总之,构造函数中的虚函数可能会导致未定义的行为,因为派生类的成员变量和虚函数表还没有完全初始化。为了避免这种情况,应该避免在构造函数中调用虚函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么构造函数不能为函数

1、从使用角度         函数主要用于在信息不全情况下,能使重载函数得到对应调用。构造函数本身就是要初始化实例,那使用函数也没有实际意义呀。所以构造函数没有必要是函数。...函数作用在于通过父类指针或者引用来调用它时候能够变成调用子类那个成员函数。而构造函数是在创建对象时自动调用,不可能通过父类指针或者引用去调用,因此也就规定构造函数不能是函数。...2、从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为函数    从实际含义上看,在调用构造函数时还不能确定对象真实类型(因为子类会调父类构造函数);而且构造函数作用是提供初始化...,在对象生命期只执行一次,不是对象动态行为,也没有太大必要成为函数 当一个构造函数被调用时,它做首要事情之一是初始化它V P T R。...V P T R状态是由被最后调用构造函数确定。这就是为什么构造函数调用是从基类到更加派生 类顺序另一个理由。

2.3K91
  • 禁止在构造函数里调用函数

    构造函数调用函数会导致程序出现莫名其妙行为,这主要是对象还没有完全构造完成。...这是因为基类构造函数调用一个定义在本类但是为派生类所重写函数,程序运行时候会调用派生类版本,程序在运行期类型是 A 而不是 B。...在 C# 系统会认为这个对象是一个可以正常使用对象,这是因为程序在进入构造函数函数体之前已经把该对象所有成员变量都进行了初始化。...派生类对象所具备成员变量默认值是由初始化语句或者系统来确定,因此开发人员如果想要在构造函数给这些变量赋值那么就必须等到程序运行到构造函数时才可以。...Tip:C# 对象运行期类型是一开始就定好,即便基类是抽象类也依然可以调用其中方法。 小结 在基类构造函数调用函数会导致代码严重依赖于派生类实现,然后这些实现是无法控制且容易出错

    1.6K20

    C++不要在构造函数和析构函数调用函数

    虽然可以对函数进行实调用,但程序员编写函数本意应该是实现动态联编。在构造函数调用函数函数入口地址是在编译时静态确定,并未实现调用。...但是为什么构造函数调用函数,实际上没有发生动态联编呢? 1. 不要在构造函数调用函数原因 第一个原因,在概念上,构造函数工作是为对象进行初始化。...当创建某个派生类对象时,如果在它基类构造函数调用函数,那么此时派生类构造函数并未执行,所调用函数可能操作还没有被初始化成员,浙江导致灾难发生。...在Visual C++,包含函数类对象指针被安排在对象起始地址处,并且函数表(vtable)地址是由构造函数写入指针。...因此,一般情况下,应该避免在构造函数和析构函数调用函数,如果一定要这样做,程序猿必须清楚,这是对函数调用其实是实调用。

    3.6K30

    构造函数为什么一般不定义为函数?而析构函数一般写成函数原因 ?

    浏览量 3 1、构造函数不能声明为函数 1)因为创建一个对象时需要确定对象类型,而函数是在运行时确定其类型。...而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象实际类型,是类本身还是类派生类等等 2)函数调用需要函数表指针,而该指针存放在对象内存空间中;若构造函数声明为函数,那么由于对象还未创建...,还没有内存空间,更没有函数表地址用来调用函数构造函数了 2、析构函数最好声明为函数,首先析构函数可以为函数,当析构一个指向派生类基类指针时,最好将基类析构函数声明为函数,否则可以存在内存泄露问题...如果析构函数不被声明成函数,则编译器实施静态绑定,在删除指向派生类基类指针时,只会调用基类析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。子类析构时,要调用父类析构函数吗?...析构函数调用次序时先派生类后基类。和构造函数执行顺序相反。并且析构函数要是virtual,否则如果用父类指针指向子类对象时候,析构函数静态绑定,不会调用子类析构。

    64310

    js 构造函数构造函数作用,构造函数和普通函数区别

    构造函数 在 JavaScript ,用 new 关键字来调用函数,称为构造函数构造函数首字母一般大写(规范)。...我们发现,虽然每位同学都有 name、age、sex这些属性, 但它们都是不同,那我们就把这些属性当做构造函数参数传递进去。...所以,虽然封装构造函数过程会比较麻烦,但一旦封装成功,我们再创建对象就会变得非常轻松,这也是我们为什么要使用构造函数原因。...所以 ES6 class写法实质就是构造函数) 4、内部用this 来构造属性和方法 5、构造函数执行流程 A、立刻在堆内存创建一个新对象 B、将新建对象设置为函数this C、...逐个执行函数代码 D、将新建对象作为返回值 6、构造函数返回值默认是this 也有其他情况 。

    3.5K10

    构造函数和析构函数可以是函数吗,在里面能调用函数

    先说构造函数构造函数作为函数是不可以,首先c++编译器上不会让你通过 在内存上,我们知道,一个对象会有一个函数表,函数表在构造函数初始化,可是一个对象还没有完成实例化,他函数表是不存在...,一个对象需要调用构造函数完成实例化,这里形成了一个悖论 在意义上,将构造函数声明为函数没有意义,函数主要是实现多态,c++多态是在运行时构建基类基类来调用不同函数,而不是根据情况动态调用构造函数...构造函数作为函数让人觉得是你构造函数可能是动态,那我觉得这可能是另一个设计模式,对象固定,构建方法动态来达到多态目的,后面这段是我自己看法 析构函数作为函数?...构造函数是不行,但是析构函数作为函数确实常用,特别是基类析构函数一定要声明为函数。首先既然对象存在,那么函数表肯定存在,所以析构函数作为函数是合理。...//Father f 代码运行后,构造函数只调用了父类函数,我们本来想要调用子类函数

    1.5K50

    C++-函数构造函数与析构函数分析

    1.构造函数不能为函数 当我们将构造函数定义为函数时,会直接报错: ?...首先回忆下以前学virtual函数概念: 如果类定义了函数,创建对象时,则会分配内存空间,并且为该父类以及其所有子类内存空间上额外分配一个函数表....函数作用在于,存储每个类相同函数名,然后每一次函数调用,都会去函数表查找地址 分析: 假如构造函数函数的话,由于对象开始还未分配内存空间,所以根本就无法找到函数表,从而构造函数也无法被调用....所以构造函数是不能成为函数. 2....析构函数可以为函数 首先回忆下析构函数: 当某个内对象被注销时,编译器会自动顺序调用该类以及其父类析构函数,而不会调用派生类析构函数.

    1.3K20

    函数与纯函数区别

    ; 纯函数(pure virtual)   C++包含纯函数类,被称为是“抽象类”。...抽象类不能使用new出对象,只有实现了这个纯函数子类才能new出对象。   C++函数更像是“只提供申明,没有实现”,是对子类约束,是“接口继承”。   ...C++函数也是一种“运行时多态”。   ...} //函数 virtual void xhs(){ //这个函数必须得在基类实现 cout<<"我是基类函数"<<endl;//即使是空函数也要在基类实现...} //派生类可以不写这个函数,但是派生类对象调用时会调用积累函数 //纯函数 virtual void cxhs() =0; //这个纯函数不在基类实现,必须在子类实现

    1.3K10

    C++ 构造函数与析构函数调用函数注意事项

    虽然可以对函数进行实调用,但程序员编写函数本意应该是实现动态联编。在构造函数调用函数函数入口地址是在编译时静态确定,并未实现调用。...但是为什么构造函数调用函数,实际上没有发生动态联编呢? 第一个原因,在概念上,构造函数工作是为对象进行初始化。在构造函数完成之前,被构造对象被认为“未完全生成”。...当创建某个派生类对象时,如果在它基类构造函数调用函数,那么此时派生类构造函数并未执行,所调用函数可能操作还没有被初始化成员,将导致灾难发生。...在Visual C++,包含函数类对象指针被安排在对象起始地址处,并且函数表(vtable)地址是由构造函数写入指针。...因此,一般情况下,应该避免在构造函数和析构函数调用函数,如果一定要这样做,程序猿必须清楚,对函数调用其实是实调用。

    93410

    每日一问06 构造函数可以是函数

    技术分类:开发语言 前置知识:函数工作原理 推荐阅读 :[侯捷]C++内存管理--从平地到万丈高楼 https://www.bilibili.com/video/BV1Kb411B7N8 思路 构造函数可以是函数吗...,为什么 和普通函数对比 首先,C++不支持虚拟构造函数。...是有构造函数特点决定 函数使用条件必须是通过指针或者引用调用 构造函数无法通过指针直接调用。只能通过 placement new方式调用。...我误区 根本说不清楚:直接回答vptr构造 不相关, 不懂 构造函数无法通过指针访问原理,new 如何调用类构造函数申请用法。...根本说不清楚:必须创建好了,才能用,不懂 抽象和具体关系.接口不属于具体一个类 析构函数可以是函数吗,为什么 参考思路: 可以是 析构函数 执行顺序是 派生类 ,基类 如果析构函数不被声明成函数,则编译器实施静态绑定

    70130

    java构造函数调用另一个构造函数_java构造函数

    参考链接: Java程序从另一个调用一个构造函数 package demo03; /*  * 构造方法是专门用来创建对象方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法  * 格式:... * public 类名称(参数类型 参数名称){  *         方法体  *   * }  * 注意事项:  * 1.构造方法名称必须和所在类名称完全一样,就连大小写也要一样  * 2.构造方法不要写返回值类型...,连void都不写  * 3.构造方法不能return一个具体返回值  * 4.如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数,方法体什么都不做  * 5.一旦编写了至少一个构造方法...,那么编译器将不再赠送  * 6.构造方法也是可以进行重载。  ...* 重载:方法名称相同,参数列表不同  */ public class Student {     //成员变量     private String name;     private int age

    4.5K60

    C++核心准则C.82:不要在构造函数或析构函数调用函数

    C.82: Don't call virtual functions in constructors and destructors C.82:不要在构造函数或析构函数调用函数 Reason...到目前为止,被调用函数应该只属于构造对象本身,而不是可能存在于派生类某个覆盖函数。那样做非常难理解。...最坏情况,在构造函数或者析构函数中直接或间接调用一个没有实现函数会导致没有定义行为。...从构造函数和析构函数调用函数并不是本身有什么错误。这种调用语义是安全。然而,经验表明这样调用很少是必须,很容易扰乱维护者,如果被新手使用会成为错误源。...提示来自构造函数或析构函数函数调用。

    78850

    C++函数与纯函数

    C++函数是一种特殊成员函数,用于实现多态性。函数允许在基类声明一个函数,在派生类根据需要进行重写,并通过基类指针或引用来调用派生类对象特定实现。...①函数声明 在基类,我们可以使用关键字virtual来声明一个函数。...Base* ptr; // 基类指针 Derived derivedObj; // 派生类对象 ptr = &derivedObj; // 将基类指针指向派生类对象 // 调用函数,根据对象实际类型执行不同实现...ptr->show(); ③派生类重写函数 派生类可以重写基类函数,以提供自己实现。...函数使用动态绑定,即运行时将根据对象实际类型选择正确函数实现。 构造函数不能是函数。 静态成员函数不能是函数函数可以被继承,派生类可以选择是否重写函数

    21210

    多态析构函数

    为什么析构函数要声明成virtual呢? 因为,如果delete一个基类指针时, 如果它指向是一个子类对象,那么析构函数不为就会导致无法调用子类析构函数,从而导致资源泄露。...在这里,因为~Animal()是virtual,尽管是通过Animal类型指针调用,根据表v-table信息,~Dog()被正确调用到。...如果把virtual属性去掉,那么被调用是~Animal(),Dog类构造函数被调用而析构函数未被调用,构造函数中分配资源没有释放,从而产生了内存泄漏。...去掉析构函数virtual属性后,因为该类没有其他virtual函数,所以编译时不会生成v-table,这样就节省了编译时间,并减少了最终生成程序大小。...并没有这个virutal构造函数

    77560
    领券