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

如果不从派生构造函数调用基础构造函数会发生什么?

如果不从派生构造函数调用基础构造函数,将会导致基础构造函数中的初始化代码不会被执行,从而可能导致派生对象的成员变量没有正确初始化。

在面向对象编程中,派生构造函数用于初始化派生类的成员变量,并且通常会调用基础类的构造函数来初始化基础类的成员变量。基础构造函数负责初始化基础类的成员变量,确保派生类对象在创建时具有正确的初始状态。

如果派生构造函数没有调用基础构造函数,基础类的成员变量将不会被初始化,可能导致派生类对象的行为不可预测。这可能会导致程序运行时出现错误、崩溃或不正确的结果。

因此,为了确保正确的对象初始化,派生构造函数应该调用基础构造函数,以便执行基础类的初始化代码。这可以通过在派生构造函数的初始化列表中调用基础构造函数来实现。例如,在C++中,可以使用派生构造函数的初始化列表来调用基础构造函数,如下所示:

代码语言:cpp
复制
DerivedClass::DerivedClass() : BaseClass() {
    // 派生类的初始化代码
}

在这个例子中,DerivedClass是派生类,BaseClass是基础类。通过在派生构造函数的初始化列表中调用BaseClass(),确保了基础类的构造函数被正确调用,从而初始化基础类的成员变量。

总结起来,如果不从派生构造函数调用基础构造函数,将导致基础类的成员变量没有正确初始化,可能导致程序运行时出现错误或不正确的结果。因此,在派生构造函数中应该始终调用基础构造函数,以确保正确的对象初始化。

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

相关·内容

dotnet C# 多次对一个对象调用构造函数发生什么

今天来玩一点变态的,使用反射获取到某个类型的构造函数,接着多次对此类型的某个对象调用构造函数方法。...请问此时会发生什么 假定有一个类型 Foo 的定义如下 class Foo : IDisposable { public Foo()...详细请看 dotnet C# 只创建对象不调用构造函数方法 此时虽然 Foo 对象 foo 创建了,但是此对象还没有经过构造函数。...当然就是 2 了 那如果用反射取出构造函数,对 foo 对象调用构造函数呢 var constructorInfo = typeof(Foo).GetConstructor...回顾一下基础知识,在类里面写的 public int F2 { set; get; } = 10; 代码其实是 C# 语言带来的功能,在构建的时候,会被转写为大概如下的构造函数代码

78010

dotnet C# 如果构造函数抛出异常 析构函数是否执行

假设在某个类型的构造函数里面抛出了异常,那么这个对象的析构函数是否执行 如下面代码 private void F1() { try...原因是在 .NET 运行时,是先创建出对象,然后再调用对象的构造函数。...而在创建出对象时,此对象就需要被加入垃圾回收,加入垃圾回收,自然就会调用到析构函数 那为什么即使在构造函数里面抛出异常,没有构造成功,也需要在垃圾回收调用析构函数。...是因为构造函数也不一定是一句话都没有跑的,例如在构造函数里面已分配了一些非托管的内存,然后再抛出异常,自然就期望在析构函数可以释放分配的内存,也就是期望调用析构函数 本文代码还请到 github 或 gitee...gitee.com/lindexi/lindexi_gd.git git pull origin 3f16a1492f1d655ad5356e65d476c3c91b129844 以上使用的是 gitee 的源,如果

47320
  • c++学习笔记4,调用派生类的顺序构造和析构函数(一个)

    大家好,又见面了,我是全栈君 测试源代码: //測试派生类的构造函数调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include using namespace...a3也并没有调用基类的构造函数"<<endl; A *a3=&a; B b; } 输出为: 能够看到,在创建派生类的对象的时候,首先调用的是基类中的构造函数,然后才是调用派生类自己的构造函数...而在析构的时候,顺序则刚好相反,先调用派生类的析构函数,然后才是调用基类的构造函数。这是由于对象创建时候对象存放在堆栈中的原因。(new 的对象尽管是存在堆中,可是在堆栈中依旧存放其堆中的地址,因此。...析构的时候也是一样) 那么,创建其对象的数组时:A a[2],是否会调用构造函数呢。这是肯定的。...那么这个时候,假设A里面有一个函数fun(),令a[0]->fun()会发生什么情况呢?

    70610

    关于Java构造函数(Constructor)的常见问题总结1 为什么调用子类的构造方法的时候,默认会调用父类的构造方法2 常见错误:Implicit super constructor is und

    1 为什么调用子类的构造方法的时候,默认会调用父类的构造方法 看下面这个简单的例子: package cc; public class Sub extends Super { public Sub...这就是为什么我们上面的那个例子程序调用super的构造方法。 但要切记,** 虽然调用了父类的构造方法,但只创建了一个对象也就是子对象。...编译器错误是因为默认的super()无参的构造函数是没有定义的。在Java中,如果一个类没有定义构造函数,编译器自动插入一个默认的无参的构造函数。...上一小节,我们知道,如果子类的构造函数中,没有显示的调用父类的构造函数,那么,编译器就会插入super(),也就是自动调用无参的构造函数。但是此时,父类没有无参的构造函数,所以就会报错了。...我们知道如果在一个类中没有声明一个构造函数,那么编译器隐式的帮我们实现一个无参的构造函数,但如果我们一旦一个构造函数,不管带不带参数,那么编译器都不会提供默认的构造函数,所以这么做的原因是为什么呢?

    2.9K41

    创建子类对象时,父类构造函数调用被子类重写的方法为什么调用的是子类的方法?

    A对象的时候父类会调用子类方法?...但是:创建B对象父类会调用父类的方法? 答案: 当子类被加载到内存方法区后,继续加载父类到内存中。...如果,子类重写了父类的方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向父类的方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,先行调用父类的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译的时候,父类构造方法调用的方法的参数已经强制转换为符合父类方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

    6.2K10

    c++类和继承面试点25连问

    ,先调用基类的构造函数,再调用派生类的构造函数派生类对象销毁时,先调用派生类的析构函数,再调用基类的析构函数。...析构函数是否可以为虚函数如果可以,有什么作用? 析构函数可以是虚函数,因为它是对象结束时才调用,不影响虚表构建。...基于多态的作用,这个指向派生类的基类指针调用派生类的析构函数,然后再调用基类的析构函数。...构造函数里面”初始化列表”和”赋值”的区别 初始化列表和赋值的区别如下: 初始化列表只会调用一次构造函数,其实就是变量声明时初始化; 赋值调用构造函数,再调用一次赋值函数,它相当于在声明后,又进行了赋值...,结合我们知道的,如果使用了空指针,就会发生段错误,那这里肯定也会发生段错误,但实际上编译执行后并没有产生错误,print函数被正确执行了,这就很尴尬了,这是为什么呢?

    98210

    当类构造与析构的时候...

    关于虚函数部分不在这篇再提,上一篇提过了。 文章目录 什么时候会调用默认构造函数 什么时候调用拷贝构造函数什么时候调用赋值运算符? 深拷贝与浅拷贝 成员初始化列表的概念,为什么用它会快一些?...4、子类对象默认构造的时候。 ---- 什么时候调用拷贝构造函数?...用初始化列表快一些的原因是,对于类型,它少了一次调用构造函数的过程,而在函数体中赋值则会多一次调用。而对于内置数据类型则没有差别。...1、初始化一个const成员 2、调用基类构造函数时的传参 3、初始化不存在默认构造函数的别的类的对象 ---- 构造/析构函数的执行顺序 构造的时候:如果基类,先调用基类的构造函数,再调用自己的构造函数...析构的时候,如果有基类,且基类的析构函数是虚函数,则先调用自己的构造函数,再调用基类的构造函数如果基类的析构函数不是虚函数,则调用基类的析构函数。 ---- 继承机制中对象之间如何转换?

    63920

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

    但是为什么构造函数调用函数,实际上没有发生动态联编呢? 1. 不要在构造函数调用函数的原因 第一个原因,在概念上,构造函数的工作是为对象进行初始化。...当创建某个派生类的对象时,如果在它的基类的构造函数调用函数,那么此时派生类的构造函数并未执行,所调用函数可能操作还没有被初始化的成员,浙江导致灾难的发生。...第二个原因,即使想在构造函数中实现动态联编,在实现上也遇到困难。这涉及到对象虚指针(vptr)的建立问题。...从输出结果来看,类A的析构函数对show()调用并没有发生调用。...因此,一般情况下,应该避免在构造函数和析构函数调用函数如果一定要这样做,程序猿必须清楚,这是对虚函数调用其实是实调用

    3.6K30

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

    但是为什么构造函数调用函数,实际上没有发生动态联编呢? 第一个原因,在概念上,构造函数的工作是为对象进行初始化。在构造函数完成之前,被构造的对象被认为“未完全生成”。...当创建某个派生类的对象时,如果在它的基类的构造函数调用函数,那么此时派生类的构造函数并未执行,所调用函数可能操作还没有被初始化的成员,将导致灾难的发生。...第二个原因,即使想在构造函数中实现动态联编,在实现上也遇到困难。这涉及到对象虚指针(vptr)的建立问题。...从输出结果来看,类A的析构函数对show()调用并没有发生调用。...因此,一般情况下,应该避免在构造函数和析构函数调用函数如果一定要这样做,程序猿必须清楚,对虚函数调用其实是实调用

    93410

    C++-带你初步走进继承(1)

    派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认 的构造函数,则必须在派生构造函数的初始化列表阶段显示调用。 2....派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。 3. 派生类的 operator= 必须要调用基类的 operator= 完成基类的复制。 4....,这就说明了当派生类进行实例化时,会调用基类的构造函数构造派生类中基类的成员。  ...当我自己写了一个Student的构造函数,那么怎么初始化基类的成员呢?可以在初始化列表调用基类的构造函数,然后我们可以看到,是先调用了基类的构造函数,再构造派生类的成员。...所以在派生类的析构函数调用之后,基类的析构函数自动调用

    13510

    【C++】继承

    到现在为止,我们已经学过很多域了,比如局部域、全局域、类域、命名空间域等等,派生类和基类的作用域当然也是不同的,如果继承中基类和子类有名字相同的成员函数或变量,则子类屏蔽父类的这些同名成员,如果调用则优先调用子类的同名成员...派生类的构造函数只能调用基类的构造函数来初始化基类的那部分成员,不能在自己的构造函数里面初始化基类成员,值得注意的是,如果基类有默认构造函数,那我们不需要管基类成员的初始化工作,只要把派生类自己的成员在构造函数里面初始化即可...但如果基类没有合适的默认构造,那则必须在派生类的初始化列表显示调用基类的有参构造函数进行基类成员的初始化。 2....派生类对象初始化时,先调用基类构造调用子类构造,在析构时与栈结构相同,先调用子类的析构函数,在子类析构函数调用完毕时,编译器自动调用基类的析构函数。...: // 1、构造函数,父类成员默认调用父类的构造函数完成初始化。

    69910

    【C++修炼之路】15.C++继承

    _name; // 姓名 }; 下面就开始探讨: 4.1 派生类的构造函数 派生类不写构造函数,不会报错: 如果将基类构造函数去掉,派生类不写默认成员函数就会报错,因为派生调用的是父类的构造函数。...4.2 派生类的拷贝构造函数 接着上段构造函数的代码,如果不写拷贝构造,编译器默认生成: 对于拷贝构造,我们需要拷贝构造的有三部分:基类继承下来的类型、内置类型、自定义类型。...如果不写拷贝构造,完全可以解决基类继承下来的和内置类型,因为属于基类的类型自动调用基类的拷贝构造,上面的结果也可以证实这一点,而内置变量的拷贝构造随着初始化列表进行值拷贝,因此不写拷贝构造的结果与类和对象中的情况是一样的...4.4 派生类的析构函数 如果按照正常的逻辑写析构函数,会发生报错: 这是析构函数与前三者的不同,如果加上作用域,就不会发生错误: class Student : public Person { public...如果基类没有默认的构造函数,则必须在派生构造函数的初始化列表阶段显示调用派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。

    54400

    从零开始学C++之继承(一):公有私有保护继承、overloadoverwriteoverride之间的区别

    (实际上是继承了但不可见),如果派生类的成员函数中想要调用基类的被隐藏函数,可以使用 “ 基类名::函数名(参数)”的语法形式,如果被隐藏的函数是public的,则在类体外也可以使用“ 派生类对象.基类名...首先想到的是在C++ 中,子类的构造函数自动调用父类的构造函数。同样,子类的析构函数自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。...Try的构造函数的时候,直接跳过FinalClass2而直接调用MakeFinal的构造函数。...调用try的构造函数时,调用它包含的所有virtual base类的构造函数,然后再调用它上层的base类构造函数,然后是设置vptr,最后是初始化列表和子类构造函数体内的用户代码。...如果不是virtual继承,那么try首先调用的是它上层base类的构造函数,也就是FinalClass的构造函数,然后由FinalClass的构造函数调用MakeFinal的构造函数,由于FinalClass

    96300

    【C++】从零开始认识继承

    ,内置类型不处理,自定义类型会调用构造函数。...总结 派生类的默认成员函数的注意事项: 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生构造函数的初始化列表阶段显示调用。...派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。 派生类的operator=必须要调用基类的operator=完成基类的复制。...派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。 派生类对象初始化先调用基类构造再调派生构造。...什么是菱形继承?多继承的问题是什么? 菱形继承如字面意思(两个父类的父类是同一个类就会发生菱形继承),多继承本身没什么问题,真正的问题是有多继承就可能发生菱形继承。

    7510

    【C++】继承

    但我们看到s自动去调用了它父类的构造和析构。 那如果我子类对象自己显示实现构造函数呢? 我们发现这里我们自己初始化继承下来的_name成员但是报错了。 为什么不行呢?...那这里要告诉大家的是: 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。...所以,我们要这样写 所以,这里我们就可以认为必须分开处理,子类的构造函数即使我们不写,默认生成构造函数的在初始化从父类继承下来的成员时也自动去调父类的构造函数如果我们自己实现了子类的构造函数...如果基类没有默认的构造函数,则必须在派生构造函数的初始化列表阶段显示调用。 那其实这里感觉就有点像子类里面有一个父类的自定义类型的成员一样。...我们来调试一下: 栈溢出了,为什么栈溢出呢? 我们可以观察一下调用堆栈 我们看到应该是operator=这里死递归了。 为什么这样呢?

    13610

    学过 C++ 的你,不得不知的这 10 条细节!

    析构函数 析构函数 可以发现在进入 operator== 函数时,发生了「复制构造函」,当离开该函数作用域后发生了「析构函数」。...多态性质基类需声明 virtual 析构函数 如果在多态性质的基类,没有声明一个 virtual 析构函数,那么在 delete 基类指针对象的时候,只会调用基类的析构函数,而不会调用派生类的析构函数,...from son bye from son bye from father 无疑地会有一个 CSon(派生类) 构造函数调用,但首先 CFather(基类) 构造函数一定会更早被调用。...---- 细节 07 小结 - 请记住 在构造和析构期间不要调用 virtual,因为这类调用不会下降至派生类。...同样也不要令「赋值操作符函数调用构造函数」。 如果你发现你的「复制构造函数和赋值操作符函数」有近似的代码,消除重复代码的做法是:建立一个新的成员函数给两者调用

    75120

    《C++Primer》第十五章 面向对象程序设计

    无论派生出多少个派生类,对于每个静态成员来说都只存在一个唯一的实例。 2.4 防止继承的发生 有时我们定义这样一个类,不希望其他类继承它,或者不想考虑它是否适合作为一个基类。...如果一个虚函数需要调用它的基类版本,但是没有使用作用域运算符,那么导致无限递归。 抽象基类 1....虚函数与作用域 从名字查找先于类型检查我们可以得知为什么基类和派生类中的虚函数什么必须有相同的形参列表了。...如果基类含有几个构造函数,则除了两个例外情况外大多数派生继承所有的构造函数如果派生类定义的构造函数与基类的构造函数有相同的参数列表,则该构造函数不会被继承,定义在派生类中的构造函数替换继承而来的构造函数...默认、拷贝和移动构造函数不会被继承,这些构造函数按照正常规则被合成,因此如果一个类只含有继承的构造函数,则它也将拥有一个合成的默认构造函数 容器与继承 当我们使用容器存放继承体系中的对象时,必须采用间接存储的方式

    1.2K20
    领券