C++对象切片探秘:派生类对象如何被‘切割’?

这篇具有很好参考价值的文章主要介绍了C++对象切片探秘:派生类对象如何被‘切割’?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++对象切片探秘:派生类对象如何被‘切割’?

 

概述:C++中的对象切片指通过将派生类对象赋值给基类对象,导致派生部分被“切掉”,只保留基类部分。这可能发生在值传递、赋值等操作中。对象切片的基础功能示例展示了派生类对象赋值给基类对象时的现象,而高级功能示例则展示了通过基类指针实现派生类对象的访问和多态。

对象切片(Object Slicing)是指通过将派生类对象赋值给基类对象,导致派生类对象的派生部分被“切掉”,只保留基类部分的现象。这通常发生在使用值传递或赋值操作时。

基础功能:

示例源代码:

#include <iostream>
#include <string>

class Base {
public:
    Base(int baseData) : baseData_(baseData) {}
    virtual void Print() const {
        std::cout << "基类数据:" << baseData_ << std::endl;
    }
private:
    int baseData_;
};

class Derived : public Base {
public:
    Derived(int baseData, const std::string& derivedData)
        : Base(baseData), derivedData_(derivedData) {}
    void Print() const override {
        std::cout << "基类数据:" << GetBaseData() << ", 派生类数据:" << derivedData_ << std::endl;
    }
private:
    std::string derivedData_;
};

void DisplayBaseObject(const Base& obj) {
    obj.Print();
}

int main() {
    Derived derivedObject(42, "派生数据");
    
    // 对象切片发生,只保留基类部分
    Base baseObject = derivedObject;
    DisplayBaseObject(baseObject);

    return 0;
}

在这个示例中,Derived 类公有继承自 Base 类,当派生类对象 derivedObject 被赋值给基类对象 baseObject 时,发生了对象切片。虽然 derivedObject 包含派生类的数据成员,但只有基类部分被保留。

高级功能:

示例源代码:

#include <iostream>
#include <memory>

class Base {
public:
    virtual void Print() const {
        std::cout << "基类数据:" << baseData_ << std::endl;
    }
protected:
    int baseData_ = 0;
};

class Derived : public Base {
public:
    void Print() const override {
        std::cout << "基类数据:" << baseData_ << ", 派生类数据:" << derivedData_ << std::endl;
    }
private:
    std::string derivedData_ = "派生数据";
};

int main() {
    std::unique_ptr<Base> basePtr = std::make_unique<Derived>(); // 指向派生类对象的基类指针

    // 通过基类指针调用虚函数,实现多态
    basePtr->Print();

    return 0;
}

在这个示例中,通过使用智能指针 std::unique_ptr,可以实现指向派生类对象的基类指针。通过基类指针调用虚函数 Print,实现了多态性。这也是对象切片的一种应用,通过基类指针可以访问派生类的虚函数。

 

C++对象切片探秘:派生类对象如何被‘切割’?文章来源地址https://www.toymoban.com/news/detail-842278.html

到了这里,关于C++对象切片探秘:派生类对象如何被‘切割’?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【浅尝C++】继承机制=>虚基表/菱形虚继承/继承的概念、定义/基类与派生类对象赋值转换/派生类的默认成员函数等详解

    🏠专栏介绍:浅尝C++专栏是用于记录C++语法基础、STL及内存剖析等。 🎯每日格言:每日努力一点点,技术变化看得见。 我们生活中也有继承的例子,例如:小明继承了孙老师傅做拉面的手艺。继承就是一种延续、复用的方式。C++为了提高代码的可复用性,引入了继承机制,

    2024年04月10日
    浏览(48)
  • 【Unity每日一记】如何从图片中切割对象(一键切割图集的方法你掌握了吗?)

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity每日一记 ⭐【软件设计师高频考点暴击】 ⭐【Unityc#专题篇】之c#系统化大礼包】 ⭐【unity数据持久化】数据管理类_PlayerPrfs ⭐【u

    2024年04月09日
    浏览(70)
  • 探秘C++中的神奇组合:std--pair的魅力之旅

    在C++编程中,我们常常会遇到需要将两个相关的数据元素组合在一起的情况。为了满足这一需求,C++标准库提供了一个名为std::pair的实用工具,可以将两个数据元素组合成一个对象。std::pair不仅易于使用,而且在实际编程中有着广泛的应用。 本文将详细介绍std::pair的定义、基

    2023年04月16日
    浏览(31)
  • 学习C++:C++进阶(六)如何在C++代码中调用python类,实例化python中类的对象,如何将conda中的深度学习环境导入C++项目中

    目录 1.应用场景 2.场景:利用maskrcnn深度学习网络实现语义分割 3.CMake配置python解释器

    2023年04月22日
    浏览(42)
  • 基类与派生类对象的关系 派生类的构造函数

    🐶博主主页: @ᰔᩚ. 一怀明月ꦿ  ❤️‍🔥 专栏系列: 线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++ 🔥 座右铭: “不要等到什么都没有了,才下定决心去做” 🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 🐰

    2023年04月10日
    浏览(39)
  • c++继承和派生(1)

    目录 1.含义:从不同层面看的,同一种意思 2. 继承的使用场景  1.  共同之处  2.  迭代更新  3.  代码重构  3. 继承的基本语法  4. 继承了什么  1. 查看占用内存大小 2.  使用vs自带的功能查看类的内存分布 布局:  3. 结果  5. protected  -- 子类的特权 1)  三个访问权限  2)

    2024年01月17日
    浏览(44)
  • 高程 | 继承与派生(c++)

    ⭐️ 概念 类的 继承 ,是新的类从已有类那里 得到已有的特性 。 类的 派生 ,从已有类 产生新类的过程 。 原有的类称为基类或父类,产生的新类称为派生类或子类。 直接参与派生出某类的基类称为直接基类,基类的基类甚至更高层的基类称为间接基类。 ⭐️ 语法 class

    2024年02月19日
    浏览(35)
  • C++ | 继承(基类,父类,超类),(派生类,子类)

    文章参考:https://blog.csdn.net/war1111886/article/details/8609957 一 .继承中的访问权限关系 1.基类,父类,超类是指被继承的类,派生类,子类是指继承于基类的类.  2.在C++中使用: 冒号表示继承,如class A : public B;表示派生类A从基类B继承而来 3.派生类包含基类的所有

    2024年02月15日
    浏览(42)
  • c++ 派生类 文本查询程序再探

    2024年02月14日
    浏览(32)
  • HotSpot 虚拟机对象探秘

    在 HotSpot 虚拟机中,对象的内存布局分为以下 3 块区域: 对象头(Header) 实例数据(Instance Data) 对齐填充(Padding) 对象头 对象头记录了对象在运行过程中所需要使用的一些数据: 哈希码 GC 分代年龄 锁状态标志 线程持有的锁 偏向线程 ID 偏向时间戳 对象头可能包含类型

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包