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

【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )

一、继承 + 组合 模式的类对象 构造函数和析构函数调用规则 1、场景说明 如果一个类 既 继承了 基类 , 又 在类中 维护了一个 其它类型 的 成员变量 , 那么 该类 的 构造 与 析构 , 就需要涉及到...类 本身 的 构造函数 和 析构函数 , 父类 的 构造函数 和 析构函数 , 类 成员变量 的 构造函数 和 析构函数 ; 2、调用规则 在 继承 + 组合 的情况下 , 构造函数 与 析构函数 调用规则如下...函数调用" << endl; } public: int z; D d; }; 可根据下面的调用规则 , 分析出 C 类对象中 , 涉及到的 父类构造/析构函数 , 自身构造/析构函数..., 分析构造函数调用顺序 ; A 和 B 的构造函数 , 是 父类构造函数 ; D 构造函数 , 是 成员构造函数 ; C 构造函数 , 是 自身构造函数 ; 构造函数的调用顺序为 : 父类 -> 成员...; 析构函数的调用顺序为 : 自身 -> 成员 -> 父类 , 符合上述的调用原则 ; A 构造函数调用 B 构造函数调用 D 构造函数调用 C 构造函数调用 obj.x = 1 , obj.y = 2

20510

【C++】类和对象(中):类的默认成员函数,构造函数、析构函数、拷贝构造函数、运算符重载

构造函数的本质就是要代替我们以前Stack类中写的Init函数功能,构造函数能自动调用的特点就完美替代了Init函数。 2.1构造函数的基础特点 共4点: 1.函数名与类名相同。 2.无返回值。...(什么都不给,连void都不需要写) 3.对象实例化时系统会自动调用对应的构造函数。 4.构造函数可以重载。 以时间类Date为例。...,还记得吗,需要我们手动调用STInit(); 而这个构造函数会自动被调用 int main() { Date da; da.Print(); return 0; } 其实在我们实例化对象时构造函数就调用了...在C语言中实参传给形参就是直接拷贝过去,不会调用一个函数,在C++中传值传参要调用拷贝函数。 我们在直接调用拷贝构造函数时,因为是引用传参,就不会形成新的拷贝函数。...理解了这个点之后我们再来看日期类Date,Date里面都是内置类型,我们需要自己写拷贝构造函数吗?不需要了吧,编译器会自动生成。

11910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

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

    6.2K10

    你知道吗?多个类多线程环境下静态构造函数的执行顺序

    网上很多资料说到静态构造函数,但是很少提到与线程相关的,这个例子实际上是想测试一下静态构造函数的多线程冲突。 其实,这个问题源自于XCode v7.3中一个隐秘的BUG。...实体类A的静态构造函数中可能会开一个线程去执行方法B,然后静态构造函数接着执行后续方法C,问题就在于B和C都会争夺同一个锁,如果B拿到这个锁,它会创建一个A的实例,但是因为A的静态构造函数正常执行C,C...// 2,CreateOperate将会实例化一个TEntity对象,从而引发TEntity的静态构造函数, // 避免实际应用中,直接调用Entity的静态方法时,没有引发...答案: 上面微软的答复邮件说得很清楚,静态构造函数只会被调用一次,并且在它执行完成之前,任何其它线程都不能创建这个类的实例或使用这个类的静态成员!...4,也是最隐秘的地方。测试代码中,在A的静态构造函数里面使用了匿名函数,而编译器会把它编译成为A的一个静态方法,因此,它就成了A的静态成员了,所以…… 实际上,我们没注意到的地方是第四点,太粗心了!

    88270

    ASP.NET AJAX(6)__Microsoft AJAX Library中的面向对象类型系统命名空间类类——构造函数类——定义方法类——定义属性类——注册类类——抽象类类——继承类——调用父类方

    可重复注册命名空间,每个独立的脚本模块前都要注册命名空间以保证命名空间存在 类 定义构造函数 定义成员(方法、属性、事件) 注册类 类——构造函数 类的构造函数即为function定义 通常用于初始化域变量..._mymethod=function{throw Error.notImplemented();}}//包含抽象方法 类——继承 调用父类的构造函数 有父类的类必须调用父类的构造函数,否则会丢失继承效果...= function(name) { MyNamespace.Intern.initializeBase(this, [name]);//调用父类构造函数 } MyNamespace.Intern.prototype...Employee的三个类 接口 与类的定义方法大致相同 构造函数抛出异常 所有的方法抛出异常(只有方法签名,不提供实现) 注册接口时使用registerInterface方法 接口无法继承其他接口 接口定义...= function(name) { MyNamespace.Intern.initializeBase(this, [name]);//调用父类构造函数 } MyNamespace.Intern.prototype

    6.2K50

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

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

    18820

    深入理解javascript中的继承机制(2)临时构造函数模式Uber – 从子对象调用父对象的接口将继承部分封装成函数

    为了解决前文提到的将共有的属性放进原型中这种模式产生的子对象覆盖掉父对象同名属性的问题,就出现了另一种模式,我们称作为临时构造函数模式 临时构造函数模式 我们具体通过代码来分析 function Shape...F,然后将Shape构造函数的原型对象赋给F的原型。...Uber – 从子对象调用父对象的接口 传统的面向对象的编程语言都会有子对象访问父对象的方法,比如java中子对象要调用父对象的方法,只要直接调用就可以得到结果了。...,给每个构造函数天价了一个uber属性,同时使他指向父对象的原型,然后更改了Shape的toString函数,更新后的函数,会先检查this.constructor是否有uber属性,当对象调用toString...时,this.constructor就是构造函数,找到了uber属性之后,就调用uber指向的对象的toString方法,所以,实际就是,先看父对象的原型对象是否有同String,有就先调用它。

    1.6K20

    【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 私有继承 " 的 派生类 , 是 不具有 基类 的 完整功能的 , 因为 最终继承 后的派生类 , 无法在 类外部调用 父类的 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...// 父类对象 可以调用 父类公有函数 parent.funParent(); // 子类对象 可以调用 子类自身公有函数 child.funChild();...// 子类对象 可以调用 父类公有函数 child.funParent(); // 将指向子类对象的指针传给接收父类指针的函数 // 也是可以的 fun_pointer...// 通过父类指针调用父类函数 p_parent->funParent(); // 将指向子类对象的指针传给接收父类指针的函数 // 也是可以的 fun_pointer

    30920

    【日更计划094】数字IC基础题【SV部分】

    上面的例子中,function调用了一个耗时的task,这是非法的。 [192] systemverilog中new()和new[]有什么区别? new()时systemverilog中类的构造函数。...他在类中定义,并初始化对象。 new[]用于动态数组的内存分配。 [193] 什么是systemverilog中的前置声明? 有时候,一个类有可能引用另一个尚未编译的类,这会导致编译错误。...task传入pkt句柄,而在内部为句柄创建了一个对象。在initial块中,调用了gen_packet,并修改了pkt.dest,但是对于task来说这些都是局部的。...你答对了吗 本期题目 [195] systemverilog中,类成员的private、public和protect属性是什么意思?...[198] systemverilog中的interface是什么? [199] 什么是modport? [200] interface是可综合的吗?

    72310

    svlib文档翻译(第一至四章)

    用户可以根据需要创建这些类的实例(见下文4.3节)。然而,在某些情况下,简单地调用一个函数,比创建一个对象、配置数据,然后调用它的方法并最终从对象中提取处理过的数据更方便。...很多特性这两种形式都有,因此可以选择更方便的一种。有关更多细节,请参阅每个特性的文档。 4.3 构造svlib对象 svlib的许多部分都使用定义了SystemVerilog类。...因此,为了使用svlib特性,用户的代码中必须创建这些类型的新对象。然而,为了稳定性,提高内存管理效率,「用户代码不应该直接调用任何svlib类的new函数」。...所有主流的SystemVerilog仿真器现在都提供了对受保护的构造函数的全面支持。因此,所有的svlib类构造函数都声明为protected的,因此用户代码不可能直接调用它们。...4.4 错误处理 偶尔,svlib函数可能会导致内部错误。尤其是函数调用C库时,在C库中可能存在内存分配、文件权限甚至文件存在等问题。

    1.4K40

    【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

    , 这个增加的参数是 对象本身的指针 ; 在 Student 类中 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 在成员函数中 , 通过 this 指针访问对象本身的成员 ; 在全局函数中 , 实现两个 Student 类相加 , 接收两个...; } 详细代码 , 参考最后的完整代码示例 ; 二、有参构造函数设置默认参数值 ---- 为 Student 类定义了有参构造函数 , 则其默认的无参构造函数 , 就不会生成 ; // 带参构造函数..." << endl; } 此时 , 如果要创建 Student 对象 , 只能调用上述 有参构造函数 , 如果使用 Student s2 的方式调用 默认构造函数 创建 Student 对象 , 就会报错...; 如下带参数的构造函数 , 并且为其 有参构造函数 的参数 设置一个默认值 , 此时就可以使用 类名 对象名 的方式定义对象变量 ; class Student { public: // 带参构造函数

    23820

    svlib文档翻译(第五章)

    第一种形式是关于字符串变量的简单函数,通常(但不总是)返回字符串结果。这些函数在svlib包中定义,名称都以str_开头。 第二种形式是Str类对象的方法(注意大写的S)。...Str类是SystemVerilog字符串的wrapper,通过引用传递字符串,并使一些操作更方便。 对比使用简单函数,使用Str对象必须在所有操作之前构造对象。...copy函数则返回一个新的对象,并且它的内容与调用的对象一致。...因此,svlib提供了一些字符串操作作为包级函数,作为类方法的替代。这些函数执行的操作与Str类的相应方法完全相同。...例如,如果我们要调用函数str_range(.s("Hello"), .p(3), .n(4), .origin(Str::START)),它将指定下面图表中阴影代表的范围: ?

    96420

    IC验证培训——SystemVerilog通用程序库(下)

    这些类的方法适用于任何偏好基于用类表示的用户。然而,我们预计许多用户将更喜欢在包级别的简单的函数调用接口。...Str类中的cread方法用作构造函数,但具有一些有用的附加属性,将在第七节中更详细地讨论。 不鼓励用户直接调用任何svlib类的构造函数。...为了减轻这个问题,我们建立这个库来确保它无论创建多少对象都不会对随机化的稳定性产生影响。我们通过这种方法来实现:取消使用任何svlib类的构造函数,而不是将构造函数放到每个类提供的静态方法中。...这里给出一些假象的svlib_C类的创建方法。 通过在对象构造中保存和恢复调用进程的随机化状态,我们保证svlib不会干扰用户的随机化,因此用户可以自由地添加或删除基于svlib的调试代码。...为了降低这个成本,我们在C中实现了缓存状态,隐藏了SystemVerilog包状态。因为跨DPI边界的所有交互都是通过隐藏的私有函数而不是用户可调用的代码来执行的,我们可以自信地做到这一点。

    1.2K30

    【日更计划089】数字IC基础题【SV部分】

    上期答案 [182] systemverilog的function和task中“ref”和“const ref”是什么意思? ref关键字用于通过引用而不是值的方式传递参数。...子例程/函数与调用者共享句柄以访问值。这是传递诸如类对象或对象数组之类的参数的有效方法,否则创建副本将消耗更多内存。...同样,由于调用方和function/task共享相同的引用,因此使用ref在函数内部完成的任何更改也对调用方可见。 例如:这是一个CRC函数的示例,该函数需要一个大数据包作为参数来计算CRC。...通过作为参考传递,每次调用CRC函数都不需要在存储器上创建数据包的副本。...你答对了吗 本期题目 [183] systemverilog的function和task中“ref”和“const ref”是什么意思? [184] 压缩数组和非压缩数组的区别是?

    68020

    【旧文重发 | 06】IC基础知识

    在OOP上下文中,这是指实体在运行时引用各种类的对象的能力。这可以通过SystemVerilog中的继承和虚函数的概念(以及C++中存在的函数和运算符重载的概念)来实现。...构造函数是类的特殊成员函数,每当创建该类的实例时,构造函数就会自动调用。在C++中,它与类具有相同的名称。在SystemVerilog中,它作为new()函数实现。 [109] 什么是析构函数?...与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函数。...在C++中,它与类具有相同的名称,并带有波浪号字符前缀,而在SystemVerilog中,由于该语言支持自动垃圾收集,因此没有析构函数。...要创建虚方法,在基类中的方法声明之前要加上关键字virtual。在派生类中重新定义基类方法的这种方式也称为方法重写。使得调用方法时,是根据对象类型而不是句柄类型调用函数。

    1.1K20

    当类中的方法全部都是 static 关键字修饰时 ,它的构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用,需要调用构造方法。 但 static的

    当类中的方法全部都是 static 关键字修饰时 ,它的构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用,需要调用构造方法。...但 static的方法直接用类名调用就行!...可以通过类名调用。     其实它本身也可以通过对象名调用。     推荐使用类名调用。     静态修饰的内容一般我们称其为:与类相关的,类成员。...成员变量属于对象,所以也称为实例变量(对象变量)。   B:内存中位置不同     静态变量存储于方法区的静态区。     成员变量存储于堆内存。   ...D:调用不同     静态变量可以通过类名调用,也可以通过对象调用。     成员变量只能通过对象名调用。

    1.1K20

    【UVM COOKBOOK】Testbench Architecture【一】

    然而,这种构造风格只针对SystemVerilog仿真器,从而限制了可移植性。使用SystemVerilog类和SystemVerilog接口的另一种风格架构,可以提高执行引擎之间的可移植性。...这两部分是一个BFM接口和一个代理类。BFM接口处理信号级代码,而代理类处理常规事务器将执行的任何其他操作。BFM和代理之间通过函数和任务调用进行通信。...这主要是因为信号级代码被放置到SystemVerilog接口而不是类中。SystemVerilog类提供了强大的面向对象功能,包括SystemVerilog接口所忽略的继承和多态性。...如果子组件的配置很复杂或者很可能更改,那么建议添加一个实现基本(或默认)配置处理的虚函数,然后可以通过在base test类扩展的test case中重写该虚函数来更改配置。...分层build过程 UVM中的build phase自顶向下工作。一旦构造了test类,其build()方法将被调用,然后是它的每个子组件的build()方法,以此类推,直到构造了完整的环境层次结构。

    1.6K20

    SystemVerilog中的Process(2)--- 进程的控制

    本期黄鸭哥主要给大家讲解 named block、wait_order、wait_fork、disable,还有SystemVerilog中的内建类:process类。...而关于disable fork,这个是我们工程项目中使用的最多的一类,也是最容易踩坑的一类,disable fork的用法我推荐大家学习下Q哥的一篇文章:disable fork,你真的会用吗?...4 内建类:process SystemVerilog中内建了一种class,可以对进程进行访问和控制,此种class就是process,我们先来看下process类的原型: ?...类中的resume函数来解除KILLED: 该进程被强制终止了 kill() 终止该进程以及该进程的子进程 await() 等待其他进程结束,不能在该进程中,调用该方法,只能是别的进程调用本进程的...历史推荐 SystemVerilog中的Process(1)---产生进程的方式 disable fork,你真的会用吗? IC验证之“Timescale”使用小谈(一) 同学,不来留个言吗!!!

    3.8K51

    验证仿真提速系列--SystemVerilog编码层面提速的若干策略

    好了,废话不说了,请出干货: 1.频繁的函数/任务调用会增加开销 比如:用foreach遍历方式计数(foreach有内置函数),不如单独的计数器!如下代码: 这样写比较慢: ? 这样写比较快: ?...对于简单调用,编译器可以将函数/任务内联以避免堆栈帧操作,但复杂调用因为编译器性能考虑原因通常不会内联,每个函数/任务都将数据引用或完整的数据副本推送到调用堆栈,并处理任何指定的返回。...在systemverilog testbench中,引用通常是同时遍历类实例层次结构和动态类型,所有这些都可以在仿真运行期间更改。因此,模拟器必须遍历所有引用才能获得数据,这显然会降低速度。...因为logic类型的语义除了在input、inout之外的所有情况下全都默认为变量存储!所以你的代码有时候可能仿真正确,但不知道为啥比想象中的慢!...如上例子中A2.y、A2.X1.y和A2.X1.T1.y是不同的,粗体wire声明允许将它们折叠为单个对象。

    1.7K11

    数字IC笔试题(10)——System Verilog的class类相关问题

    X 答案:A 解析: new 函数中并没有把传入的 addr 值赋值给对象,所以不管 new 传入多少,都是打印的 bit [31:0] addr 的默认值,此处没有赋值,打印 0; 做如下修改: (1...:进队该类和子类可见,类外不可见; 静态和动态: static:静态,被该类的所有实例共享; dynamic,动态,默认; SystemVerilog 中不允许静态方法读取静态变量。...父类子类 类中通过()关键字访问父类的成员 A. super B. virtual C. parent D. this 答案:A 解析: 由于子类不能继承父类的构造方法,因此,要调用父类的构造方法,必须在子类的构造方法体的第一行使用...super() 方法,该方法会调用父类相应的构造方法来完成子类对象的初始化工作。...A:super,子类访问父类的成员,调用父类的构造方法; B:virtual,虚函数; C:parent,指向父类的指针,使用 parent 调用父类的构造函数进行父类的初始化; D:this,自己用;

    1.3K20
    领券