首页 > 其他分享 >对象切割 和 虚函数

对象切割 和 虚函数

时间:2024-08-30 16:22:48浏览次数:13  
标签:切割 对象 派生类 Base 基类 函数

对象切割

简介: 当你将一个派生类对象赋值给一个基类对象时,只会保留基类部分的信息,派生类的特有信息会被丢弃。这就是所谓的对象切割(slicing)
发生时刻: 将派生类对象赋值给父类对象时, 如下

class Father{};
class Son : public Father{};
Son s;
Father f = s; 			// 发生对象切割, 只保留积累信息

与对象切割相对的虚函数表

具体介绍虚函数, 请看虚函数应用和原理
当你通过基类指针或引用调用虚函数时,最终会通过虚表来找到实际要调用的函数。

用例详解

class Base
{
public:
	virtual void f()
	{
		cout << "Base : f" << endl;
	}
};

class Derived : public Base
{
public:
	virtual void f() override
	{
		cout << "Derived : f" << endl;
	}
};

int main()
{
	Base* d = new Derived();
	d->f();							// 通过虚函数表调用了派生类自己的f函数

	Base d2 = *d;					// 发生了对象切割, d2是base对象
	d2.f();

	Base& d3 = *d;					// 基类的引用, 实际上引用的是Derived, 调用的也是派生类的虚函数表
	d3.f();

	Base* d4 = d;					// 基类的指针, 实际上指的是Derived, 调用的也是派生类的虚函数表
	d4->f();

	return 0;
}

执行结果
在这里插入图片描述

标签:切割,对象,派生类,Base,基类,函数
From: https://blog.csdn.net/qq_40666620/article/details/141719540

相关文章

  • C#中通用返回对象Result<T>(定义及使用)
     1.定义返回对象//Result对象是一种显式表示成功结果或失败的类型//方法可以返回这个类,而不是引发异常。如果操作失败,则Result对象将包含错误消息或代码,但不包含异常publicclassResult<T>{publicTValue{get;}publicstringEr......
  • C# 面向对象的7大原则之开闭原则(Open-Closed Principle,OCP)
    定义开闭原则(OCP):软件实体应对扩展开放,对修改关闭。通俗来讲就是,当需要进行扩展时,在不更改现有代码的前提之下,进行扩展。举例假设有一个动物发出声音的类为Animal,最初只有Dog(狗)和Cat(猫),后续需要新增Cow(牛);按照开闭原则,不应修改Animal类、Dog类或Cat类,而是创建新的Cow类,并在适......
  • C# 面向对象的7大原则之单一职责原则(Single Responsibility Principle,SRP)
    定义单一职责原则(SRP):一个类只能有一个引起它变换的原因。通俗来讲就是一个类只负责一个职责,若负责的职责太多,可能会由于其中一个职责的变化而影响其他职责。举例假设有一个Student,它既负责了学生的基本信息,又负责了学生平均成绩的计算,这就违反了单一职责原则。public......
  • MYSQL实现Oracle中decode函数
    背景:写oracle脚本迁移mysql时,mysql不支持decode函数思路:理解decode函数使用方法及参数含义1、decode(expression,value,result1,result2)     理解:如果expression=value,则输出result1,否则输出result22、decode(expression,value1,result1,value2,result2,value3,res......
  • Winobj 是一个由微软提供的工具,用于查看和浏览 Windows 操作系统中的对象命名空间。它
    Winobj是一个由微软提供的工具,用于查看和浏览Windows操作系统中的对象命名空间。它允许你查看系统中的各种对象,如文件系统对象、注册表键、符号链接等,帮助深入了解系统的内部结构。Winobj是由微软开发的一个工具,起源于微软的内部开发和调试需求。它最初是为了帮助开发人员和......
  • 02.类、对象、成员函数的介绍
    2.类、对象、成员函数的介绍2.1类的基本概念在上一节中,讨论了类,对象,数据成员(属性),成员函数(行为)。有日期对象、时间对象、音频对象、视频对象、汽车对象、人对象等。几乎任何名词都可以在属性(如名称、颜色和大小)和行为(如计算、移动和通信)方面合理地表示为软件对象。可以将......
  • 用manim证明函数的左右极限
    http://t.csdnimg.cn/2pVdFhttp://t.csdnimg.cn/2pVdF在上一节的最后两个示例中,我们看到了两个不存在的限制。然而,对于每个例子来说,每个限制不存在的原因是不同的。我们看一下下面的例子: 极限不存在,因为函数没有固定为单个值 t走近t=0。越接近  t=0  我们移动得越......
  • 常用函数
    一、常用日期函数1.unix_timestamp:返回当前或指定时间的时间戳selectunix_timestamp();selectunix_timestamp("2020-10-28",'yyyy-MM-dd');2.from_unixtime:将时间戳转为日期格式selectfrom_unixtime(1603843200);3.current_date:当前日期selectcurrent_date......
  • DBA_oracle日期函数-【来自多个项目】
    selectTO_DATE(trunc(F_GXSJ),'YYYY-MONTH-DD')fromfsxx_dx_log_newwheretrunc(F_GXSJ)=TO_DATE()selecttrunc(F_GXSJ)fromfsxx_dx_log_new--2012-10-26selectSUBSTR(TO_CHAR(trunc(F_GXSJ),'YYYY-MM-DD'),6,2)fromfsxx_dx_......
  • Makefile编写2--使用变量,函数
    一、使用变量1、变量值的替换其格式是“$(var:a=b)”或是“${var:a=b}”,其意思是,把变量“var”中所有以“a”字串“结尾的“a”替换成“b”字串。2、把变量的值再当成变量x=yy=za:=$($(x))3、override指示符如果有变量是通常make的命令行参数设置的,那么......