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

如何让子类返回自身的副本,而不是它继承的父类?

要让子类返回自身的副本,而不是继承的父类,可以通过以下方式实现:

  1. 在父类中定义一个返回类型为父类的虚函数(或抽象函数),用于返回子类的副本。
  2. 在子类中重写该虚函数,并在其中创建一个新的子类对象,将当前子类对象的属性复制到新对象中,并返回新对象的指针或引用。
  3. 在子类中调用父类的该虚函数,以确保父类的属性也被复制到新对象中。

以下是一个示例代码:

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

class Parent {
public:
    virtual Parent* clone() const {
        return new Parent(*this);
    }
};

class Child : public Parent {
public:
    virtual Child* clone() const override {
        return new Child(*this);
    }
};

int main() {
    Parent* parent = new Child();
    Parent* clone = parent->clone();
    
    std::cout << "Type: " << typeid(*clone).name() << std::endl;
    
    delete parent;
    delete clone;
    
    return 0;
}

在上述示例中,父类Parent定义了一个虚函数clone(),返回类型为Parent*。子类Child重写了该虚函数,并返回类型为Child*。在main()函数中,创建了一个子类对象Child,并将其赋值给父类指针Parent*。然后调用clone()函数,返回的是子类对象的副本,而不是父类对象的副本。最后输出了副本对象的类型。

请注意,这只是一种实现方式,具体的实现方法可能因编程语言和具体情况而异。

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

相关·内容

JS 原生方法原理探究(四):如何实现继承几种方式?

缺点也很明显: 第一:由于构造函数只调用了一次,导致子类原型都统一指向了这次调用所创建实例,所以子类实例在访问一些自身没有的引用类型属性时,实际上访问都是那同一个实例上属性。...这种继承方法优点就在于,解决了原型链继承缺点,我们现在可以往传参了,而且每次 new 子类时候都会重新调用一次,这使得子类所有实例都有自己属性副本。...组合继承最大问题在于,两次调用了构造函数。...这里通过一个 inherit 函数接受子类子类继承方法。...相反,我们借鉴了寄生式继承做法,创建了一个原型副本作为子类原型。

1.4K20

《JavaScript 模式》读书笔记(6)— 代码复用模式2「建议收藏」

相反,page对象本身则具有一个tags属性,这是由于它在使用借用构造函数时候,新对象会获得对象中tags成员副本不是引用)。   ...使用本模式时,kid获得了自身属性name,但是却从未继承过say()方法,如果试图调用该方法将会导致错误。继承是一个一次性操作,仅会复制对象属性并将其作为子对象自身属性,仅此而已。...本模式一个优点在于可以获得对象自身成员真实副本,并且也不会存在于子对象意外覆盖对象属性风险。   因此,在前面的情况中,如何才能使子对象也能够继承原型属性?...本模式经验法则在于:可复用成员应该转移到原型中不是放置在this中。因此,出于继承目的,任何值得继承东西都应该放置在原型中实现。...存在从其他继承。 在子类中可以访问或超。   tips:让我们从这里改变思维,由于在贲张这一步分钟讨论主题是有关模拟概念,因此尽在这里自由使用“class”这个词语。

19620

Java知识面试题复习(三)Java面向对象

关于继承如下 3 点请记住: 子类拥有非 private 属性和方法。 子类可以拥有自己属性和方法,即子类可以对进行扩展。 子类可以用自己方式实现方法。...运行时多态是面向对象最精髓东西,要实现多态需要做两件事: 方法重写(子类继承并重写中已有的或抽象方法); 对象造型(用类型引用子类型对象,这样同样引用调用同样方法就会根据子类对象不同表现出不同行为...运行时多态是动态,它是通过动态绑定来实现,也就是我们所说多态性。 多态实现 Java实现多态有三个必要条件:继承、重写、向上转型。 继承:在多态中必须存在有继承关系子类。...对于Java而言,多态实现机制遵循一个原则:当超对象引用变量引用子类对象时,被引用对象类型不是引用变量类型决定了调用谁成员方法,但是这个被调用方法必须是在超中定义过,也就是说被子类覆盖方法...,抛出异常小于等于,访问修饰符大于等于(里氏代换原则);如果方法访问修饰符为private则子类中就不是重写。

35730

「思维导图学前端 」一文搞懂Javascript对象,原型,继承

首先明确下继承中三个主体:子类子类实例。那么怎么才能让子类实例和搭上关系呢? 原型链继承 所谓继承,简单说就是能通过子类实例访问属性和方法。...[1] 关键点:子类原型成为实例,子类实例也是实例。 缺点:无法继承构造函数给实例挂载属性。...(child.propA, child.propB, child.nationality); 这里child.propA是undefined,因为子类实例不是实例,无法继承原型属性。...child instanceof Father; // false 关键点:构造函数复用。 缺点:子类实例不是实例,无法继承原型属性。 组合继承 所谓组合继承,就是综合上述两种方法。...然而我们做继承目的是很单纯,即“子类继承类属性和方法”,但并不应该给子类原型挂载不必要属性导致污染子类原型。 有人会说“这么一点副作用怕什么”。

71520

字节前端必会面试题

----问题知识点分割线---- 继承原型继承核心思想:子类原型成为实例实现:function SuperType() { this.colors = ['red', 'green'];}...function SubType() {}// 原型继承关键: 子类原型成为实例SubType.prototype = new SuperType();// 测试let instance1 =...:原型中包含引用类型属性将被所有实例对象共享子类在实例化时不能给构造函数传参构造函数继承核心思想:在子类构造函数中调用构造函数实现:function SuperType(name) {...优点是可以在子类构造函数中向构造函数传参。存在问题是:1)由于方法必须在构造函数中定义,因此方法不能重用。2)子类也不能访问原型上定义方法。...寄生式组合继承(最佳)核心思想:通过构造函数继承属性,但使用混合式原型继承方法,即,不通过调用构造函数给子类原型赋值,而是取得原型一个副本

56320

混合设计“

理论强烈建议子类使用相同方法名来表示特定行为,从而子类重写。我们之后会看到,在JavaScript代码中这样做会降低代码可读性和健壮性。 设计模式 “”是设计模式?...子类会包含行为原始副本,但是也可以重写所有继承行为甚至定义新行为。非常重要一点是,我们讨论子类不是实例。...从概念上来说,子类Bar应当可以通过相对多态引用(或者说Base)来访问Foo中行为。需要注意,子类得到仅仅是继承行为一份副本。...多态并不表示子类有关联,子类得到只是一份副本继承其实就是复制。 多重继承 还记得我们之前关于子类和 DNA 讨论吗?...多态(在继承不同层次名称相同但是功能不同函数)看起来似乎是从子类引用,但是本质上引用其实是复制结果。 JavaScript 并不会(像那样)自动创建对象副本

16120

面向对象之继承那几种模式

面向对象三大特征、封装、继承、多肽,js中同样有这三种特征,js是一门弱语言,俗称解释性语言,通常来说比起高级语言,他没有严格类型约束,为了代码写得更健壮,维护性更强,因此有了ts约束,继承是能让代码更加通用...子类自身属性与自身属性同名时,此时子类访问就会有值,访问自身属性,c.ParentName打印就会是888 于此同时子类prototype修改会同时修改prototype 临时构造器 现在我有一个需求...prototype属性,自身属性并不会继承,因此这种与临时构造器功能上如出一辙,子类并不能修改自身属性。...原型链继承 实际上还有一种更简单继承,子类prototype等于实例,也称为原型链继承 function Parent() { this.name = 'parent'; this.say...、构造器继承【call】、原型链继承、extends继承4、call构造函数在子类构造函数调用call实现继承除了了自身属性和自身方法能被继承访问,原型方法子类无法访问 5、Child.prototype

20630

【前端词典】继承

与 staff 已经没有原型链关系了 缺点 只能继承对象实例属性和方法,不能继承对象原型属性和方法 无法实现函数复用,每个子对象都有对象实例副本,性能欠优 四、组合继承(推荐) 指的是将原型链技术和借用构造函数技术结合起来...子类必须在 constructor 方法中调用 super 方法,否则新建实例时会报错。这是因为子类没有自己 this 对象,而是继承 this 对象,然后对其进行加工。...这是因为子类实例构建,是基于对实例加工,只有 super 方法才能返回实例。...`super` 虽然代表了 `A` 构造函数,但是返回子类 `B` 实例,即` super` 内部 `this ` 指的是 `B`,因此 `super()` 在这里相当于 A.prototype.constructor.call...子类 prototype 属性 __proto__ 属性,表示方法继承,总是指向 prototype 属性。

58570

混合对象“

类似地,你通常也不会使用一个实例对象来直接访问并操作,不过至少可以判断出这个实例对象来自哪个。 把和实例对象之间关系看作是直接关系不是间接关系通常更有助于理解。...构造函数会返回一个对象(也就是一个实例),之后我们可以在这个对象上调用showOff()方法,来输出指定CoolGuy特长。 显然,跳绳乔成为了一个非常酷家伙。...子类会包含行为原始副本,但是也可以重写所有继承行为甚至定义新行为。 非常重要一点是,我们讨论子类不是实例。...从概念上来说,子类 Bar 应当可以通过相对多态引用(或者说 super)来访问 Foo 中行为。需要注意,子类得到仅仅是继承行为一份副本。...多态并不表示子类有关联,子类得到只是一份副本继承其实就是复制。 多重继承 有些面向对象语言,允许继承多个,多重继承意味着所有定义都会被复制到子类中。

72020

里氏替换原则为你效力

如果要保证这点,我们在设计继承关系时候,子类不应重写方法,这样保证了行为没有被修改。...因为我知道你可能会怼我:"我设计这个子类我就想基于做一个扩展,不同子类有不同实现,没让你在使用时候去替换呀!...比如Rectangle,首先对自身属性width和height进行了隐藏,通过calculateArea方法提供服务,将依赖自身数据计算细节也进行了隐藏 继承:允许子类在不需要重新编写前提下,...所以,继承首先应该体现一种现实世界真实规则Is-A,复用是提供一个核心能力,也是我们期望在设计上能获得好处,而要达到复用,就要遵守一个规则:子类不去更改已有的行为,否则就与复用不沾边了(复用...背后隐含逻辑应该是: 我们应该积极去思考更好设计,不是过早放弃思考机会 --- 注释 KiSS: Keep it simple, stupid DRY: Don't Repeat Yourself

1.1K70

JAVA 面向对象

* ) 多态 ---- * 方法重写 * * 方法不合适,可以在子类中重写 * * 就近原则,我们在子类重写方法,调用该方法时候就会调用子类方法。...* * * 多态 * * 方法多态 * 构造方法多态 * 成员方法多态 * 引用多态 * 创建出子类对象,可以用子类引用去指向,也可以用引用去指向...new student(); * * 构造函数没有返回值 * * * * * * */ /* * 引用范围概念: * 使用引用指向子类对象是不能调用自身具有的成员,不能使用子类扩展成员...Interface3 Extends Interface0, Interface1, interface…… 不允许多重继承主要原因是,如果A同时继承B和C,b和c同时有一个D方法,A如何决定该继承那一个呢...2)方法名字、返回类型、参数必须与接口中完全一致。如果方法返回类型不是void,则方法体必须至少有一条return语句。

1K60

c++面试题

继承是在编译时刻静态定义,且可直接使用,继承可以较方便地改变实现。但是继承也有一些不足之处。首先,因为继承在编译时刻就定义了,所以无法在运行时刻改变从父继承实现。...更糟是,通常至少定义了子类部分行为,任何改变都可能影响子类行为。如果继承下来实现不适合解决新问题,则必须重写或被其他更适合替换。...6.子类析构时要调用析构函数吗?...继承:广义继承有三种实现形式:实现继承(指使用基属性和方法而无需额外编码能力)、可视继承(子窗体使用窗体外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。...当子类重新定义了虚函数后,指针根据赋给它不同子类指针,动态调用属于子类该函数,这样函数调用在编译期间是无法确定(调用子类虚函数地址无法给出)。

1.2K11

Python之面向对象

这两个函数去返回我们想要两个变量。...先说继承,顾名思义,当我们定义一个class时候,可以从别的class继承,新成为继承子类继承称为基或者。这里我们举个例子来说明一下: ?...这里我们总结一下: 1.当子类都有run方法时候,子类run方法将run方法覆盖了,代码运行时候调用子类run方法; 2.当子类中没有run方法中存在run方法时,子类将调用...run方法; 3.当子类中有eat方法中没有eat方法时,子类将调用自己eat方法; 这就是Python当中继承和多态,当我们新增一种Animal子类时,子类可以直接调用方法,当子类定义了和类同名方法时...此时,若新建一个子类时,只需要定义子类需要方法不用管原来代码是如何调用

33720

C++雾中风景14:CRTP, 模板黑魔法

这就给代码看起来有些"唬人",看起来像是继承自己一样。但其实呢?这里只是用到了模板派生,能够在编译器感知到子类模板存在,二者不是真正意义上继承关系。...核心作用是利用子类信息来生成代码,我们来具体看看对应代码实现 这里通过子类模板信息,在之中派生出一个指向自身weak_ptr。...Doris之中应用了CRTP来实现颠倒继承目的。 颠倒继承(Upside Down Inheritance),顾名思义就是通过子类添加功能。因为效果与普通继承到子逻辑是相反。...next与prev函数就是利用了颠倒继承与reinterpret_cast强制类型转换,获取了能够返回子类指针能力,从而子类再通过继承拥有了对应能力。...Blocknext与prev方法便自动能够返回指向Block指针了。

1.6K32

Python 进阶指南(编程轻松进阶):十六、面向对象编程和继承

类似于函数,继承是一种代码重用技术,您可以将其应用于。这是将置于父子关系中行为,在这种关系中,子类继承方法副本,使您不必在多个中复制一个方法。...继承如何工作 要创建一个新子类,可以将现有名称放在class语句括号中。...组合是一种设计技术,它将对象包含在中,不是继承那些对象。这就是我们在给添加属性时所做事情。当使用继承设计你时,支持组合不是继承。...我们可以创建一个Vehicle,并Car、Motorcycle和LunarRover继承不是将这些代码复制并粘贴到每个中。...使用组合不是继承通常更灵活,因为实现了与一个对象和其他对象“有”关系,不是直接从那些其他继承方法。这意味着一个对象可以拥有另一个对象。

51620

Js继承实现方式

使符合原型链规定 var child = new Child(); // 实例化子类 child.say(); // child // 此时子类能够访问say方法,在查找name属性时候首先在自身属性中查找成功所以不再向上查找...Parent原型链上 特点 新增原型方法与属性,子类都能访问到 非常纯粹继承关系,实例是子类实例,也是实例 子类实例可以继承构造函数属性和方法、原型属性和方法 不足 无法实现多继承...; // child 特点 子类实例不会共享类属性方法 实例化子类时可以向构造函数传参 通过调用多个构造函数可以实现多继承 不足 实例并不是实例,只是子类实例 只继承构造函数属性和方法...,没有继承原型属性和方法 每个子类都有实例函数副本,拷贝了函数不是引用,影响性能 实例继承实例增加成员与方法,作为实例返回 // 定义父 function Parent(from...Child() 不足 不支持多继承 实例是实例,不是子类实例 同样也是将成员与方法做了实例化拷贝 拷贝继承 通过直接将属性拷贝到子类原型中实现继承 // 定义父 function

2K20

Java基础教程(8)-Java中面向对象和(二)

通过封装你可以控制程序哪一部分可以访问成员。通过控制访问,可以阻止对象滥用;一个成员如何被访问取决于修改声明访问指示符。...protected : 表明成员变量或者方法对自身,与同在一个包中其他可见,其他包下不可访问,除非是他子类。...default : 表明该成员变量或者方法只有自己和其位于同一个包内可见,其他包内不能访问,即便是子类继承通过继承创建称为“子类”或“派生”,被继承称为“基”、“”或“超”...实现继承和接口继承区别:实现继承:如果多个某个部分功能相同,那么可以抽象出一个出来,把他们相同部分都放到里,他们都继承这个。...是has-a关系建议在同样可行情况下,优先使用组合不是继承

7610

面向对象程序设计

抽象 封装主要讲的是如何隐藏数据、数据访问保护,抽象讲的是如何隐藏方法具体实现,方法调用者只需要关心方法提供了哪些功能,并不需要知道这些功能是如何实现。...单继承表示一个子类只能继承一个; 多继承表示一个子类可以继承多个。 --- 为了实现继承这个特性,需要程序设计语言提供一定语法机制来支持。...--- 继承存在意义、继承好处:继承一个最大好处就是代码复用。假如两个有一些相同属性和方法,我们就可以将这些相同部分,抽取到基中,两个子类继承。...这样,两个子类就可以重用基代码,避免代码重复写多遍。 不过,代码复用这个好处也并不是继承所独有的,我们也可以通过其他方式来解决代码复用问题,比如利用组合关系。...可维护性变差原因:子类高度耦合,修改代码,会直接影响到子类。 多态 一个对象变量可以指向多种实际类型现象被称为多态(polymorphism)。

1.9K120

【游戏开发】在Lua中实现面向对象特性——模拟继承、多态

而设置元表和__index元方法这一步也是必不可少,我们需要借助查找机制来实现继承和多态等。...2.利用Lua实现继承   在上面我们实现了Lua中,那么实现继承也就不是什么难事了,SubClass.lua 代码如下: 1 require 'Class' 2 3 --声明了新属性Z...,self.z) 26 end   代码里面的注释已经很全了,关键点是通过设置SubClass元表为Class,从而很方便地实现了继承,这还是要归功于table查找机制。...在子类SubClass中,我们可以自由地新增字段和子类独有的新方法。而且还可以重定义或者说覆盖/重写方法,类似于Java中override,子类覆盖虚方法。...至于如何改进tolua/ulua,他们支持面向对象特性,我们将在以后篇章中继续探讨。

2K20
领券