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

c++是否可以在不基于基类的派生类中创建构造函数?

是的,C++中可以在不基于基类的派生类中创建构造函数。派生类的构造函数可以通过初始化列表调用基类的构造函数,或者在函数体中调用基类的构造函数来初始化继承的基类部分。如果派生类没有显式定义构造函数,则会自动调用基类的默认构造函数。如果派生类定义了构造函数,但没有显式调用基类的构造函数,则会自动调用基类的默认构造函数。在派生类的构造函数中,可以使用基类的成员和方法,以及派生类自己的成员和方法。这样可以实现对派生类对象的初始化和操作。

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

相关·内容

从零开始学C++之继承(二):继承与构造函数派生类转换

一、不能自动继承成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 构造函数不被继承,派生类需要声明自己构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承来成员初始化调用构造函数完成(如果没有给出则默认调用默认构造函数)。...从输出可以看出: 派生类对象构造次序: 先调用对象成员构造函数,接着是构造函数,然后是派生类对象成员构造函数,最后是派生类自身构造函数。...也可以这样来看:构造函数执行顺序是先执行初始化列表,然后是函数体。...向下转型不安全,没有自动转换机制 // 从语法上来演示对象可以转化为派生类对象,但是没有意义 1、转换构造函数: Manager(const Employee& other) : Employee

1.5K00

C++构造函数分类 ② ( 不同内存创建实例对象 | 栈内存创建实例对象 | new 关键字创建对象 )

一、不同内存创建实例对象 1、栈内存创建实例对象 在上一篇博客 【C++构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...) , 介绍了 三种类型 构造函数 , 并在 main 函数 分别 调用了这 3 种构造函数 ; 下面的调用方式 , 调用一个构造函数 , 创建 Student 实例对象 , 最终将实例对象赋值给了...栈内存 变量 Student s1 ; 这些都是 栈内存 创建 实例对象 情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 会自动将栈内存实例对象销毁 ; 栈内存 调用 构造函数 创建 实例对象 , 不需要关注其内存占用 ; 2、堆内存创建实例对象 栈内存 声明 实例对象 方式是 : 该 s1...; Student* s2; C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建 实例对象 ; 在下面的 C++ 代码 , 声明并定义了 MyClass , 该类定义了一个有参构造函数

16220

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

一、继承 C++很重要一个特征就是代码重用。C语言中重用代码方式就是拷贝代码、修改代码。C++可以用继承或组合方式来重用。通过组合或继承现有的创建,而不是重新创建它们。...(四)、接口继承与实现继承 我们将公有成员函数称为接口。 公有继承,公有成员函数派生类仍然是公有的,换句话说是接口成为了派生类接口,因而将它称为接口继承。...实现继承,对于私有、保护继承,派生类继承接口。派生类将不再支持公有接口,它希望能重用实现而已,因而将它称为实现继承。...(实际上是继承了但不可见),如果在派生类成员函数想要调用被隐藏函数可以使用 “ 名::函数名(参数)”语法形式,如果被隐藏函数是public,则在体外也可以使用“ 派生类对象.名...首先想到C++ ,子类构造函数会自动调用父构造函数。同样,子类析构函数也会自动调用父析构函数。要想一个不能被继承,我们只要把它构造函数和析构函数都定义为私有函数

93800

轻松搞定面试“虚”

函数作用是允许派生类重新定义与类同名函数,并且可以通过指针或引用来访问派生类同名函数,达到多态目的。 2.什么是纯虚函数,什么是纯虚,有什么作用?...是否每个析构函数都要设置成virtual?是否可以将析构函数设置成内联函数。 这样做是为了当用一个指针删除一个派生类对象时,派生类析构函数会被调用。...(动态绑定是根据对象动态类型而不是函数名,调用构造函数之前,这个对象根本就不存在,它怎么动态绑定?) 6.是否可以析构函数或者构造函数调用虚函数构造函数不要调用虚函数。...构造时候,虚函数是非虚,不会走到派生类,既是采用静态绑定。...C++是不可以构造对象部分时候调用子类函数实现。

66420

领悟面向对象就离开发应用不远了(提高)有你对面向对象所有疑问,爆肝1w字

(继承了实现) 派生类还继承了接口 当然派生类和其他使用方法大致一样:可以有自己构造函数可以添加额外数据成员和成员函数 插个访问权限事情 首先派生类不能直接访问私有成员,...: 首先构造对象 将信息传递给对象 派生类构造函数应该初始化派生类新增数据成员 流程就像我上张图片一样,程序首先调用构造,再调用派生类构造。...虚函数函数源于c++继承,是多态一种。c++,一个指针或者引用可以指向或者引用派生类对象。同时,派生类可以重写成员函数。... 可以中将被重写成员函数设置为虚函数,其含义是:当通过指针或者引用调用该成员函数时,将根据指针指向对象类型确定调用函数,而非指针类型。... C++,要创建抽象,可声明纯虚函数

51820

《挑战30天C++入门极限》图例实解:C++继承特性

图例实解:C++继承特性   整个c++程序设计全面围绕面向对象方式进行,继承特性是c++一个非常非常重要机制,继承特性可以使一个新获得其父操作和数据结构,程序员只需增加原有没有的成分...一旦成功定义派生类,那么派生类可以操作所有数据成员包括是受保护型,上面代码a.EditSC(100,4); 就是例子,甚至我们可以构造派生类对象时候初始化他们,但我们是推荐这么做...至于为什么派生类能够对成员进行操作,我们上图可以简单说明基与子类在内存排列状态。   ...由上面的例程我们知道Car是Vehicle派生类(子类),c++规定,创建派生类对象时候首先调用构造函数初始化成员,随后才调用派生类构造函数。   ...但是要注意是,创建派生类对象之前,系统首先确定派生类对象覆盖范围(也可以称做大小尺寸),上面代码派生类对象a就覆盖于Vehicle和Car上,至于派生类对象创建是如何构造成员,我们看如下代码

39420

硬核 | C++ 基础大全

函数相关(虚函数表,虚函数指针),虚函数实现原理 首先我们来说一下,C++多态表象,函数前加上 virtual 关键字,派生类重写该函数,运行时将会根据对象实际类型来调用相应函数...,也称为某个派生类 查看派生类是否有重写函数, 如果有,就替换成已经重写函数地址;查看派生类是否有自身函数,如果有,就追加自身函数到自身函数。...派生类重写了这个虚函数,我们期望着根据对象真实类型不同,而调用各自实现函数,但实际上当我们创建一个派生类对象时,首先会创建派生类部分,执行构造函数,此时,派生类自身部分还没有被初始化...也就是说构造派生类部分是,编译器会认为这就是一个类型对象,然后调用类型函数实现,并没有按照我们想要方式进行。即对象派生类构造函数执行前并不会成为一个派生类对象。...析构函数也是同理,派生类执行了析构函数后,派生类自身成员呈现未定义状态,那么执行析构函数是不可能调用到派生类重写方法

1.2K10

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

,放到c++里面,其实就是实现了代码重用,即派生类要使用属性和方法,就不用再重新编写代码,这种可以算是实现继承。...,先调用构造函数,再调用派生类构造函数派生类对象销毁时,先调用派生类析构函数,再调用析构函数。...4. c++多态有什么作用 个人理解,其实就是实现了接口重用,同样接口,派生类不同实现。 5....基于多态作用,这个指向派生类指针会先调用派生类析构函数,然后再调用析构函数。...友元是否违反了封装原则 违反了,友元函数可以不受访问权限限制而访问任何成员,也就是它可以直接接触实现,当然违反了封装原则,只是有时基于我们自身某些使用场景,不得不使用友元。 20.

94610

一文带你掌握多继承,菱形继承以及虚拟继承

如果不想访问子类同名成员,可以子类成员函数显示调用父成员. 显示调用格式: : 成员 出现相同名称变量终究是容易让人混乱,还是建议子类和父定义同名成员变量....那派生类,这几个成员函数是如何生成呢? (1) 构造函数: 派生类构造函数必须调用构造函数,利用构造函数去初始化部分.并且是先调用构造之后,再去构造派生类成员....如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用(即带参构造). (2)析构函数: 进行派生类析构时,应当先析构派生类成员,再析构成员....(3拷贝构造与赋值运算符重载: 派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。 派生类operator=必须要调用operator=完成复制。...单继承好处在于它可以保证之间关系更加清晰和简单,并且可以减少代码冗余和复杂度。 多继承: C++,多继承是指当一个继承自多个父继承方式。

27250

C++高阶】C++继承学习手册:全面解析继承各个方面

return 0; } 继承定义 我们从刚刚代码示例可以看到A是(父),B是派生类(子类) 定义格式 注意:定义继承时候继承方式可以省略写,如果写则是根据定义来决定默认继承方式...派生类默认成员函数 默认成员函数 默认成员函数,“默认”意思就是指我们写,编译器会变我们自动生成一个 相关文章:默认成员函数 派生类默认函数特征 派生类构造函数必须调用构造函数初始化那一部分成员...如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用 派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化 派生类operator=必须要调用operator=完成复制...具体来说,虚拟继承会在内存创建一个虚表,并在派生类对象存储一个指向这个虚指针(即虚表指针)。虚偏移量。通过偏移量可以找到下面的A,而无需派生类对象多次存储这些数据成员。...总结 回顾学习过程,我们学会了如何定义派生类,掌握了访问控制规则,理解了构造函数与析构函数继承作用,还探讨了多重继承及其带来挑战。

20610

C++重要知识点小结---2

2.派生类可以继承所有公有和保护数据成员和成员函数。 保护访问权限对于派生类来说是公有的,而对于其它对象来说是私有的。即使是派生类也不能访问私有的数据成员和成员函数。...派生类中允许重载成员函数。如果函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针所指向对象类型来调用派生类函数。...即在为public成员,子类可以访问,并据为public为protected成员,子类也可访问之,并据为protected为private成员,子类不能访问之,这就像在应用程序不能访问似有成员一样...派生类构造函数必须激活所有构造函数,并把相应参数传递给它们。...纯虚函数 C++纯虚函数用于表示一个不能被创建实例, 必需是子类覆盖该方法定义后,方可新建实例,格式是函数后面添加 = 0。

70070

《Effective C++》读书笔记(二):构造析构赋值运算(条款05~条款12)

对于构造函数和析构函数:对于内置类型,C++中选择处理,也就是内置类型构造函数中会是随机值,因此C++11可以声明时候顺带定义一下。...() { Corgi co; return 0; } 分析代码: 代码,用派生类创建了一个派生类对象,构造函数被调用时候,会先去构造成分,然后才会去构造派生类从成分,这就意味着,会先去调用构造函数...构造函数最后会去执行count_Dog函数,问题就出现在这里,上面说了,构造函数构造期间,virtual函数不会下降到派生类,也就是说即使我们创建对象属于派生类,但是调用构造函数期间...解决这个问题,就要确定我们析构函数构造函数都没有调用virtual函数,要保证这一点,我们可以count_Dog函数变成非虚函数,另外让派生类构造函数时候给传递必要信息给构造函数...做法就是派生类拷贝构造函数和赋值重载调用拷贝构造和赋值函数

35510

C++面向对象程序设计

---- 3.1 函数默认参数 ---- C++函数形参列表形参是可以有默认值。...B A 称为派生类派生类 B 称为 示例:对于一个人来说,有姓名,年龄,性别,这些基本特征,而像是职位之类特征则是因人而异特征,创建时候,我们可以通过继承技术...,当创建派生类对象,也会调用构造函数 问题:派生类构造和析构顺序是谁先谁后?...: 派生类对象可以直接访问到派生类同名成员 派生类对象加作用域可以访问到类同名成员 当派生类拥有同名成员函数派生类会隐藏同名成员函数,加作用域可以访问到同名函数 ---- 4.6.7...,那么指针释放时无法调用到派生类析构代码 解决方式:将析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 可以解决指针释放派生类对象 都需要有具体函数实现 虚析构和纯虚析构区别

39850

C++面向对象程序设计

---- 3.1 函数默认参数 ---- C++函数形参列表形参是可以有默认值。...B A 称为派生类派生类 B 称为 示例:对于一个人来说,有姓名,年龄,性别,这些基本特征,而像是职位之类特征则是因人而异特征,创建时候,我们可以通过继承技术...,当创建派生类对象,也会调用构造函数 问题:派生类构造和析构顺序是谁先谁后?...: 派生类对象可以直接访问到派生类同名成员 派生类对象加作用域可以访问到类同名成员 当派生类拥有同名成员函数派生类会隐藏同名成员函数,加作用域可以访问到同名函数 ---- 4.6.7...,那么指针释放时无法调用到派生类析构代码 解决方式:将析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 可以解决指针释放派生类对象 都需要有具体函数实现 虚析构和纯虚析构区别

1.2K10

C++:28 --- C++内存布局(上)

1 布局 本节讨论不同继承方式造成不同内存布局。 由于C++基于C,所以C++也“基本上”兼容C。...与成员变量不同是,通过派生类重新定义函数,一个派生类可以覆盖,或者说替换掉函数定义。...5 * 执行构造函数,程序所定义其他初始化代码 (注意:一个“最终派生类实例,一定不是嵌套在其他派生类实例实例) 所以,如果你有一个包含虚函数很深继承层次,即使该继承层次由单继承构成...“最终派生类”,调用虚析构函数(按照相反顺序) VC++,有虚构造函数接受一个隐藏“最终派生类标志”,标示虚是否需要初始化。...对于析构函数,VC++采用“分层析构模型”,代码中加入一个隐藏析构函数,该函数被用于析构包含虚(对于“最终派生类”实例而言);代码再加入另一个析构函数,析构包含虚

1.1K20

后台开发:核心技术与应用实践 -- C++

同时,无论哪一种继承方式,派生类是不能访问私有 成员,私有成员只能被本类成员函数所访问,毕竟派生类不是同一个 构造派生类对象时,必须对数据成员、新增数据成员和成员对象数据成员进行初始化...派生类构造函数必须对这3成员进行初始化,其执行顺序是这样: 先调用构造函数; 再调用子对象构造函数; 最后调用派生类构造函数体 当派生类有多个时,处于同一层次各个构造函数调用顺序取决于定义派生类时声明顺序...派生类可以根据需要定义自己析构函数,用来对派生类中所增加成员进行清理工作;清理工作仍然由析构函数负责。...而 虚函数 作用是允许派生类重新定义与类同名函数,并且可以通过指针或引用来访问派生类同名函数。...纯虚函数声明函数,它在没有定义,但要求任何派生类都要定义自己实现方法。

1.3K10

C++重要知识点小结---2

2.派生类可以继承所有公有和保护数据成员和成员函数。 保护访问权限对于派生类来说是公有的,而对于其它对象来说是私有的。即使是派生类也不能访问私有的数据成员和成员函数。...派生类中允许重载成员函数。如果函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针所指向对象类型来调用派生类函数。...即在为public成员,子类可以访问,并据为public为protected成员,子类也可访问之,并据为protected为private成员,子类不能访问之,这就像在应用程序不能访问似有成员一样...派生类构造函数必须激活所有构造函数,并把相应参数传递给它们。...纯虚函数 C++纯虚函数用于表示一个不能被创建实例, 必需是子类覆盖该方法定义后,方可新建实例,格式是函数后面添加 = 0。

80970

构造与析构时候...

构造/析构函数执行顺序 继承机制对象之间如何转换? C++成员访问权限和继承权限问题 如何禁止程序自动生成拷贝构造函数?...---- C++成员访问权限和继承权限问题 三种访问权限 ① public:用该关键字修饰成员表示公有成员,该成员不仅可以可以被 访问,外也是可以被访问,是对外提供可访问接口;...,相当于公有成员,派生类可以被访问。...三种继承方式 ① 若继承方式是public,成员派生类访问权限保持不变,也就是说,成员访问权限,派生类仍然保持原来访问权限; ② 若继承方式是private,所有成员派生类访问权限都会变为私有...---- C++struct和class区别 相同点 两者都拥有成员函数、公有和私有部分 任何可以使用class完成工作,同样可以使用struct完成 不同点 两者如果不对成员指定公私有,struct

63520

C++深度探索】继承机制详解(一)

公有继承公有成员和保护成员都可以派生类访问,私有成员不能在派生类中直接访问。...5.派生类默认成员函数 6个默认成员函数,“默认”意思就是指我们写,编译器会变我们自动生成一个,那么派生类,(先不考虑取地址重载)这几个成员函数是如何生成呢?...例如: 当我们将默认构造函数缺省值"tutu",去掉,它就不再是默认构造函数,那么创建子类Student对象时就不会自动调用默认构造函数,会保错,那么这时我们就需要在初始化列表里显示调用...这是因为规定在初始化列表是不可以使用父成员 ✨拷贝构造 派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。...继承C++应用非常广泛,可以用于构建复杂层次结构,提供代码复用性和灵活性。但是,使用继承时也需要注意避免多层次继承导致关系复杂性增加,以及合理设计派生类之间关系。

7410

常见c和cpp面试题目汇总(一)

关键字可有可无 override,派生类覆盖函数,实现接口重用;特征:不同范围(派生类)、函数名字相同、参数相同、必须有virtual关键字(必须是虚函数) overwrite,派生类屏蔽了其同名函数...九、虚函数是怎么实现: 每一个含有虚函数都至少有有一个与之对应函数表,其中存放着该类所有虚函数对应函数指针(地址);示例对象包含虚函数表,只有虚指针;派生类会生成一个兼容函数表...而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象实际类型,是本身还是派生类等等 2)虚函数调用需要虚函数表指针,而该指针存放在对象内存空间中;若构造函数声明为虚函数,那么由于对象还未创建...,还没有内存空间,更没有虚函数表地址用来调用虚函数构造函数了 2、析构函数最好声明为虚函数 首先析构函数可以为虚函数,当析构一个指向派生类指针时,最好将析构函数声明为虚函数,否则可以存在内存泄露问题...如果析构函数不被声明成虚函数,则编译器实施静态绑定,删除指向派生类指针时,只会调用析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。

1.3K31
领券