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

如何将相同的对象添加到多态数组中,但又能够对该对象的复制版本进行更改?

将相同的对象添加到多态数组中,但又能够对该对象的复制版本进行更改,可以通过以下步骤实现:

  1. 创建一个多态数组,用于存储对象及其复制版本。
  2. 将相同的对象添加到数组中,这可以通过将对象的指针或引用添加到数组中来实现。
  3. 使用对象的克隆方法或拷贝构造函数创建对象的复制版本,并将复制版本添加到数组中。
  4. 对复制版本进行更改,以满足特定需求。
  5. 如果需要对原始对象进行更改,可以直接操作原始对象。
  6. 如果需要对复制版本进行更改,可以通过数组中的索引访问复制版本,并进行相应的修改操作。

这种方法可以实现对相同对象的复制版本进行更改,而不会影响原始对象或其他复制版本。这在某些场景下非常有用,例如需要对对象进行并行处理或记录对象历史状态等。

以下是一个示例代码片段,演示如何将相同的对象添加到多态数组中,并对复制版本进行更改:

代码语言:cpp
复制
#include <iostream>
#include <vector>

class Object {
public:
    virtual Object* clone() const = 0;
    virtual void print() const = 0;
};

class ConcreteObject : public Object {
public:
    ConcreteObject* clone() const override {
        return new ConcreteObject(*this);
    }

    void print() const override {
        std::cout << "Concrete Object" << std::endl;
    }
};

int main() {
    std::vector<Object*> objects;

    ConcreteObject obj;
    objects.push_back(&obj);

    ConcreteObject* objCopy = obj.clone();
    objects.push_back(objCopy);

    // 修改复制版本
    objCopy->print();

    // 修改原始对象
    obj.print();

    return 0;
}

在这个示例中,我们创建了一个多态数组 objects,并将相同的 ConcreteObject 对象添加到数组中。然后,我们使用 clone() 方法创建了 obj 的复制版本 objCopy,并将其添加到数组中。通过数组中的索引,我们可以访问并修改复制版本或原始对象。

请注意,这只是一个简单的示例,实际应用中可能需要根据具体情况进行适当的设计和实现。

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

相关·内容

java面试题汇总一(会持续更新)

不能,数组一旦实例化,它长度就是固定 31.假设数组内有5个元素,如果对数组进行反序,如何做?...\==可以判断基本数据类型值是否相等,也可以判断两个对象指向内存地址是否相同,也就是说判断两个对象是否是同一个对象,Equlas通常用来做字符串比较。 47.如何将字符串反转?...当一个类中出现了多个相同名称方法,但参数个数和参数类型不同,方法重载与返回值无关 重写叫overwrite,是字符类多态表现。当子类出现与父类相同方法,那么这就是方法重写。...); finally{}用于标识代码块,与try{}进行配合,不论try代码执行完或没有执行完(这里指有异常),代码块之中程序必定会进行; 94.抽象类和接口区别?...如果在子类定义某方法与其父类有相同名称和参数,我们说方法被重写 (Override)。子类对象使用这个方法时,将调用子类定义,它而言,父类定义如同被"屏蔽"了。

46800
  • 类继承

    多态公有继承 在实际开发过程,我们有时候希望同一个方法在派生类和基类行为是不同,也就是说,方法行为取决于调用方法对象,即同一个方法行为随上下文而异,我们将这种复杂行为称为多态(具有多种形态...如果基类某个成员函数声明了虚函数,则其派生类成员函数不需要再声明。 从代码维护层面考虑,随着类层级扩展,动态联编提高了代码灵活性和问题抽象性,使得程序维护成本大大降低。...虚函数工作原理: 通常情况下,编译器在处理虚函数时候,会给每个对象添加一个隐藏成员,成员中保存了一个指向函数地址数组指针,数组我们称为虚函数表。...虚函数表存储了为类对象进行声明虚函数地址。通常情况下,基类对象包含一个指向该类虚函数表指针。...,则该函数地址也会添加到虚函数表

    70320

    36 个JS 面试题为你助力金九银十(面试必读)

    使用循环:首先,计算字符串字符数,然后原始字符串应用递减循环,循环从最后一个字符开始,打印每个字符,直到count变为零。 7.JS如何将页面重定向到另一个页面?...(y.splice(2,5));//2,3,4,5,6 console.log(y);//[0,1,7,8,9]显示原数组数值被剔除掉了 slice和splice虽然都是对于数组对象进行截取,但是二者还是存在明显区别...4.将基本数据类型与其值进行比较,这意味着如果两个值具有相同数据类型并具有相同值,那么它们是严格相等。 5.非基本数据类型不与值进行比较。...深拷贝递归地复制对象所有值或属性,而拷贝只复制引用。 在深拷贝,新对象更改不会影响原始对象,而在浅拷贝,新对象更改,原始对象也会跟着改。...在深拷贝,原始对象不与新对象共享相同属性,而在浅拷贝,它们具有相同属性。 17.

    7.3K30

    如何通俗理解面向对象编程

    这主要是因为很多地方都没有正确解释。通常很多书籍都是从解释OOP开始,讨论三大术语:封装、继承和多态性。但是当这本书能够解释这些话题时候,任何一个刚刚开始的人都会感到失落。...我们正在创建一个int类对象a,对象值为2,str类对象b值为“Hello!”. 当我们在默认情况下用两个引号来提供字符串。...以及所有我们数据进行操作方法。我会在帖子最后解释声明第二部分。...简单地说,iPhone1现在可以访问类iPhone定义所有变量和方法。 在本例,我们不必进行任何代码复制,因为我们已经从父类iPhone继承(获取)了所有方法。因此,我们不必再次定义调用函数。...此外,你无法使用myphone更改对象内部数据。myphone.__memory = 1。 ? 但是,正如你所见,你可以在类定义函数setMemory访问和修改self.

    1.3K20

    Unity基础教程系列(八)——更多工厂(Where Shapes Come From)

    1.4 生成新形状 为了能够生成这些新形状,我们所要做就是将它们添加到我们工厂。 ? (六种形状工厂) 从现在开始,可以与旧形状一起生成新形状。...你可以将对象直接拖到数组上,Unity会将其转换为其渲染器引用。 ?...1.7 保存所有的颜色 我们代码尚未编译,因为我们还必须更改颜色数据保存方式。首先,将Game保存版本增加到5。 ? 然后调整Shape.Save,使其写入所有颜色,而不是旧颜色字段。 ?...CompositeSpawnZone进行相同更改。 ? 并在GameLevel中将ConfigureSpawn转换为SpawnShape。 ?...只要打开编辑器,私有字段值就会保留,但是下次你打开Unity编辑器时,私有字段值将被重置。通过复制创建新工厂资产时,这会造成混乱并混淆对象,因此最好确保字段永不持久。

    1.4K10

    《Effective C++》学习笔记

    条款07:为多态基类声明虚析构函数 如果一个基类可能有多态子类,那么就声明一个虚析构函数。 如果一个类有任何虚函数,那么它就应该有虚析构函数。...比如 a[i] = a[j],可能是同一个对象赋值。这时就需要慎重处理赋值操作符以免删除了自己后再用自己来赋值。 解决方法有: 先进行对象是否相同检查。...资源管理 条款13:以对象管理资源 为了确保一个对象在初始化后能够最终有效被delete,最好使用shared_ptr和auto_ptr,而前者更好,因为是基于引用计数机制,可以在复制时保持两个指针都指向同一对象...对于数组对象,两个指针不会使用对应delete[],所以容易发生错误,最好使用string或vector来取代数组。...条款44:将与参数无关代码抽离templates 任何模板代码都不该与某个造成膨胀参数产生相依关系: 因非类型模板参数造成代码膨胀(比如用尺寸做模板参数导致为不同尺寸同一对象生成多份相同代码),

    1.1K20

    写出优质Java代码4个技巧

    虽然我们希望能够写出最高效代码,但很多时候,如果想代码进行优化,我们却无从下手。例如,下面的这段代码会影响到性能吗? ? 这就得视情况而定了。...虽然性能是许多大型软件系统一个非常重要组成部分,也成为产品交付管道自动化测试套件一部分,但是还是不能够盲目的且没有目的进行优化。相反,应该已经掌握性能瓶颈进行特定优化。...乍一看,我们可以创建一个新方法,比如isSame,这个方法入参是一个Purchase对象,并每个对象id进行比较,看看它们是否相同: ?...其次,如果我们希望在BankAccount接口中添加一个新方法,我们只需在每个具体类添加新方法。在条件设计,我们必须复制现有的switch语句并将其添加到我们新方法。...此外,我们还必须在每个case语句中添加每个帐户类型逻辑。 在数学上,当我们创建一个新方法或添加一个新类型时,我们必须在多态和条件设计做出相同数量逻辑更改

    83870

    【笔记】《Effective C++》条款1-25

    C++11后加入了=delete操作, 让我们可以明确删除某些函数生成 7 为多态基类声明virtual析构函数 所有多态基类来说, 声明虚析构函数非常重要, 这是因为派生类如果被基类指针指着, 然后被..., 最好令重载赋值运算符以引用形式返回*this 这只是个协议, 但最好遵守 11 在operator=处理"自我赋值" 当对象存在指针申请空间时, 在赋值运算符我们一般都会释放旧空间, 然后创建一份和待复制内存相同内存...这种方法缺点是如果new时候发生异常, 此时当前对象指针已经被释放, 那么这个对象就会留下一个错误指针 备份指针: 在一开始指针进行备份, 然后new一个复制内存, 当没有异常发生时才去释放原先内存...如果拷贝构造是以值形式传入参数的话, 还可以直接将当前对象数据与传值进入对象进行交换 12 复制对象时勿忘其每一个成分 当你选择实现自己拷贝构造函数时, 一定要手动复制所有的局部变量, 同时调用所有基类合适拷贝函数...相当于以前auto_ptr, 只能移动而不可复制(复制操作默认是移动语义), 没有其它成员变量, 可以用make_unique来初始化数组 shared_ptr: 有引用计数指针, 因此可以复制

    1.1K30

    Unity基础教程系列(十二)——更复杂关卡(Spawn,Kill,and Life Zones)

    可以使用is操作符来检查是否可以进行类型转换,如果True,则进行类型转换,但这需要进行冗余检查。 ? 将方法复制到LifeZone并将颜色更改为黄色。 ? ?...接下来,将球体比例设置为有损比例最大绝对值。 ? ? (正确球形缩放) KillZone和LifeZone应用相同更改。...SpawnZone执行相同操作。 ? 如果还有有其他激活关卡对象类型,也要更改它们。 3.2 重构Game Level 为了使关卡对象再次更新,我们还需要调用其GameUpdate方法。...在设计一个关卡时,删除对象是很常见,如果对象已经被添加到数组,就会产生麻烦。丢失对象会产生空指针,这些空指针将在游戏模式下生成异常。 ?...如果是的话,请记录错误并中止方法。 ? 4.3 注册Game Level Objects 我们还可以更轻松地将关卡对象添加到关卡数组

    1.7K51

    【16】进大厂必须掌握面试题-100个python面试

    NumPy数组更快,您可以使用NumPy,FFT,卷积,快速搜索,基本统计信息,线性代数,直方图等内置大量内容。 Q46。 如何将添加到python数组?...这些引用指向原始对象,并且在类任何成员中所做更改也会影响其原始副本。浅拷贝允许更快地执行程序,并且取决于所使用数据大小。 深度复制用于存储已复制值。深层复制不会将引用指针复制对象。...它引用一个对象,并存储其他对象指向对象。在原始副本中所做更改不会影响使用对象任何其他副本。由于为每个被调用对象制作了某些副本,因此深层复制会使程序执行速度变慢。 Q50。...Monkey_f() MyClass f()行为进行了一些更改。...问59.什么是Python多态? 回答:多态性是指采取多种形式能力。因此,例如,如果父类具有一个名为ABC方法,则子类也可以具有一个具有相同名称和参数ABC方法。Python允许多态

    16.4K30

    36 个JS 面试题为你助力金九银十(面试必读)

    使用循环:首先,计算字符串字符数,然后原始字符串应用递减循环,循环从最后一个字符开始,打印每个字符,直到count变为零。 7.JS如何将页面重定向到另一个页面?...(y.splice(2,5));//2,3,4,5,6 console.log(y);//[0,1,7,8,9]显示原数组数值被剔除掉了 slice和splice虽然都是对于数组对象进行截取,但是二者还是存在明显区别...4.将基本数据类型与其值进行比较,这意味着如果两个值具有相同数据类型并具有相同值,那么它们是严格相等。 5.非基本数据类型不与值进行比较。...深拷贝递归地复制对象所有值或属性,而拷贝只复制引用。 在深拷贝,新对象更改不会影响原始对象,而在浅拷贝,新对象更改,原始对象也会跟着改。...在深拷贝,原始对象不与新对象共享相同属性,而在浅拷贝,它们具有相同属性。 17.

    6K20

    苏州同程旅游学长给我全面的面试知识库

    7、定义构造函数 构造函数是与该类具有相同名称成员函数。每当创建对象类时,都会自动调用构造函数。它在初始化类时构造数据成员值。 8、什么是锯齿状阵列? 具有数组类型元素数组称为锯齿数组。...“使用”块用于获取资源并进行处理,然后在执行完块后自动将其丢弃。 11、什么是序列化? 当我们想通过网络传输对象时,我们必须将对象转换为字节流。将对象转换为字节流过程称为序列化。...我们可以轻松地将自定义控件添加到多个应用程序(如果共享Dll)。因此,如果它们是私有的,那么我们可以将其复制到dll到Web应用程序bin目录,然后添加引用并可以使用它们。...使用Clone()方法,我们使用CopyTo()方法创建一个包含原始Array中所有元素数组对象。现有阵列所有元素都将复制到另一个现有阵列。两种方法都执行浅表复制。...这就是为什么它们都公开原因。 39、我们如何设置要继承类,但又要防止方法被重写? 将该类声明为公共类,并密封方法以防止其被覆盖。 40、如果继承接口具有冲突方法名称,怎么办?

    3K20

    Redis 学习笔记(一)redis 数据类型和对象机制

    在此基础上实现了 master-slave (主从)同步 主从复制 Redis 提供复制功能,能实现多个相同数据 Redis 副本,复制功能是分布式 Redis 基础 删除数据命令 # 删除指定...常见命令 zadd zset-key int member1 : 将一个带有给定分值成员添加到有序集合 zrange zset-key 0-1 : 根据元素在有序集合中所处位置,从有序集合获取对应元素...Bitmaps 相当于一个以位为单位数组数组每个单元只能存储0 和 1 , 数组下标在 Bitmaps 叫做偏移量。...、Redis 数据结构 为什么 Redis 会设计 RedisObject 对象,因为操作数据类型命令除了要对键类型进行检查以外,还需要根据数据类型不同编码进行多态处理,所以 Redis 构建了自己类型系统...,主要有: redisObject 对象机制 redisObject 对象类型检查和多态 redisObject 进行分配、共享和销毁机制 3.1 redisObject 对象机制 /*

    25340

    什么?CC++面试过不了?因为你还没看过这个!

    它指向调用成员函数那个对象。 当一个对象调用成员函数时,编译程序先将对象地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用 this 指针。...在以下场景,经常需要显式引用 this 指针: 为实现对象链式引用; 为避免同一对象进行赋值操作; 在实现一些数据结构时,如 list。...“参数” 进行是一替换。...面向对象特征 面向对象三大特征 —— 封装、继承、多态 封装 把客观事物封装成抽象类,并且类可以把自己数据和方法只让可信类或者对象操作,不可信进行信息隐藏。...多个智能指针指向相同对象对象和其相关资源会在 “最后一个 reference 被销毁” 时被释放。

    3.7K50

    Java Getter和Setter

    这意味着两个变量都引用内存同一对象 myScores 数组对象。因此,scores 或 myScores 变量所做更改 实际上是在同一对象进行。...相反,您应该找到一些将传递对象复制到内部对象方法,例如,使用System.arraycopy() 方法将元素从一个数组复制到另一个数组 。...换句话说,String对象每次更改都会导致新创建一个String对象。...仅引用被复制,因此这就是两个Collection不同但它们包含相同对象原因。换句话说,这是因为我们没有提供任何复制对象方法。...将原始集合克隆项添加到新集合。 8.为自己类型实现getter和setter 如果定义对象自定义类型,则应clone() 为自己类型实现 方法。

    6.9K11

    SqlAlchemy 2.0 中文文档(七十九)

    然后,属性行为与任何其他列映射属性相同。以前,特殊逻辑会在刷新期间触发以填充此列,这会阻止任何用户代码修改其行为。新方法在三个方面改进了这一点:1. 多态标识现在在对象构造时立即存在;2....对于使用具有可变性复合应用程序,变异跟踪扩展提供了一个基类,基类建立了一个机制,使用户定义复合类型能够向每个对象拥有父对象或父对象发送更改事件消息。...这是正确行为,因为如果传入状态包含一个过期版本 id,则应该假设状态已过期。 如果将数据合并到一个有版本控制状态,则版本 id 属性可以不定义,并且不会进行版本检查。...扩展提供了一种机制,使用户定义数据类型能够向拥有父对象发送更改事件。...对于使用具有可变性复合对象应用程序,Mutation Tracking扩展提供了一个基类,基类建立了一个机制,使用户定义复合类型能够向每个对象拥有父对象发送更改事件消息。

    9710

    C语言与C++面试知识总结

    它指向调用成员函数那个对象。 当一个对象调用成员函数时,编译程序先将对象地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用 this 指针。...在以下场景,经常需要显式引用 this 指针: 为实现对象链式引用; 为避免同一对象进行赋值操作; 在实现一些数据结构时,如 list。...“参数” 进行是一替换。...面向对象特征 面向对象三大特征 —— 封装、继承、多态 封装 把客观事物封装成抽象类,并且类可以把自己数据和方法只让可信类或者对象操作,不可信进行信息隐藏。...多个智能指针指向相同对象对象和其相关资源会在 “最后一个 reference 被销毁” 时被释放。

    5K41

    Java基础知识总结(超详细整理),java从入门到精通pdf「建议收藏」

    ,final 类所有成员方法都会被隐式指定为 final 方法; 修饰符变量:变量为常量,,如果是基本数据类型变量,则其数值一旦在初始化之后便不能更改;如果是引用类型变量,则在对其初始化之后便不能让其指向另一个对象...在早期 Java 实现版本,会将 final 方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来任何性能提升(现在 Java 版本已经不需要使用 final 方法进行这些优化了)。...将类成员变量private,提供publicget和set方法来控制属性存取动作,以保证私有属性操作安全性: 继承 继承extends:多个类存在相同属性和行为时,将这些内容抽取到单独一个类...注意:不要仅为了获取其他类某个功能而去继承 ,类与类之间要有所属(“is a” )关系 方法重写: 子类从父类继承某个实例方法无法满足子类功能需要时,需要在子类实例方法进行重新实现,这样过程称为重写...方法重写前提:继承,子类修饰符大于等于父类,方法名、参数列表、返回值类型必须相同 多态 多态:一种事物多种形态(多态前提:继承、重写、向上转型) 通过多态可以提高代码可重用性,降低模块之间耦合度

    54050
    领券