当前位置: 首页 > article >正文

C++数据切片问题,Plus多态

问题引入:

在C++开发中,数据切片是指当子类对象赋值给父类对象时,父类对象只能接收到子类对象中与父类对象数据成员对应的部分。而子类对象中新增加或修改的数据成员则被丢失,这就是数据切片问题。

1.复用的代码示例

#include <iostream>

class Base
{
public:
    Base():BaseNum(1){}
    virtual void say(){std::cout << "Base say  " << BaseNum <<  std::endl;}
    virtual ~Base(){}
private:
    int BaseNum;
};

class Derived :public Base
{
public:
    Derived():DerivedNum(2){}
    virtual ~Derived(){}
    virtual void say(){std::cout << "Derived say  " << DerivedNum << std::endl;}
    void Special() {std::cout << "Derived Special" << std::endl;}
private:
    int DerivedNum;
};

2.数据切片发生场景示例

结果看用子类初始化父类,能力并没有发生变化

父类不能调用子类重写虚函数

父类不能调用子类普通的虚函数

int main() 
{
    //栈对象,基类仅仅拷贝了派生类的基类
    Derived d2;
    Base b2 = d2;
    b2.say();
    return 0;
}
  • 输出
Base say  1

3.基类想使用子类重写的虚函数,可以用引用

引用情况下:

父类能调用子类重写虚函数

父类不能调用子类普通的虚函数

int main() 
{
    //引用对象,基类也可以实现派生类的多态行为
    Derived d3;
    Base &b3 = d3;
    b3.say();
    return 0;
}
  • 输出
Derived say  2

4.对象创建在堆,基类指针可以调用派生类重写的虚函数

int main() 
{
    //指针访问对象可以获得多态行为
    Derived* d1 = new Derived();
    Base* b1 = new Derived();
    b1->say();
    delete d1;
    delete b1;
    return 0;
}
  • 输出
Derived say  2

5.完整代码

int main() 
{
    //指针访问对象可以获得多态行为
    Derived* d1 = new Derived();
    Base* b1 = new Derived();
    b1->say();
    delete d1;
    delete b1;
    std::cout << "end.........................................1\n" << std::endl;

    //栈对象,基类仅仅拷贝了派生类的基类
    Derived d2;
    Base b2 = d2;
    b2.say();
    std::cout << "end.........................................2\n" << std::endl;

    //引用对象,基类也可以实现派生类的多态行为
    Derived d3;
    Base &b3 = d3;
    b3.say();
    std::cout << "end.........................................3" << std::endl;

    return 0;
}
  • 输出
Derived say  2
end.........................................1

Base say  1
end.........................................2

Derived say  2
end.........................................3

http://www.kler.cn/a/554886.html

相关文章:

  • WPS 中 Excel 密码取消方法大解密
  • 23种设计模式 - 解释器模式
  • 哈希表(概念)c++
  • 【黑马点评】——相关文章汇总(包括实现,优化,测试和面经总结)
  • 树莓派 4B:AI 物联网完整部署方案
  • AI工具讲解
  • 【YOLO系列】YOLOv8理论
  • 深入解析 sudo -l 命令的输出内容
  • 解锁Linux“故障宝藏”:Core Dump分析秘籍(转)
  • openharmony中HDF驱动框架关键流程说明-观察者模式
  • 芯谷D2761:为扬声器保护而生的音频限幅器
  • 雷龙CS SD NAND(贴片式TF卡)测评体验
  • 利用PHP爬虫精准获取淘宝分类详情:实战案例指南
  • 广西壮族自治区园区投促中心党委书记陶德文率团到访深兰科技
  • conda和conda-forge区别?怎么选用?
  • 第十二届先进制造技术与材料工程国际学术会议 (AMTME 2025)
  • Linux多版本管理工具介绍
  • 嵌入式开发岗位认识
  • 【数学】数论干货(疑似密码学基础)
  • uniapp manifest.json国际化配置,使用 %app.name% 占位,应用名称不会跟随系统语言改变