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

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

相关文章:

  • C++ STL中的reverse/unique/sort/lower_bound/upper_bound函数使用
  • Spring DI
  • React组件化开发详解
  • 责任链模式原理详解和源码实例以及Spring AOP拦截器链的执行源码如何使用责任链模式?
  • 【Javascript Day20】
  • MariaDB10创建用户并授权
  • Git LFS介绍(Large File Storage)大文件扩展,将大文件存储在外部存储,仓库中只记录文件的元数据(大文件的指针,类似一个小的占位符文件)
  • 深入了解XML:初学者的全面指南
  • 计算机网络:应用层 —— 动态主机配置协议 DHCP
  • 基于腾讯云大模型知识引擎×DeepSeek构建八字、六爻赛博算卦娱乐应用
  • 进程控制(靠原语实现)
  • 关于房间传感器监测数据集的探索
  • 3-知识图谱-知识图谱的存储与查询
  • [DeepSeek]二、大模型
  • 元脑服务器可用于DeepSeek部署
  • Java——多态
  • 【Leetcode 每日一题】2595. 奇偶位数
  • 阿里云ECS命名规则解析与规格选型实战指南
  • MySQL中 undolog和redolog区别
  • 《跟李沐学 AI》AlexNet论文逐段精读学习心得 | PyTorch 深度学习实战
  • 五一假期上海推出首批16条“市民健康路线”,这些健康提示请收好
  • 众信旅游:去年盈利1.06亿元,同比增长228.18%
  • 教育强国建设基础教育综合改革试点来了!改什么?怎么改?
  • 三大猪企去年净利润同比均较大幅度增长,资产负债率齐降
  • “爱泼斯坦案”关键证人弗吉尼亚·朱弗雷自杀身亡
  • 对外投资增长、消费市场持续升温,中国经济砥砺前行