相关文章推荐
安静的手套  ·  【Excel VBA】- ...·  1 年前    · 
一身肌肉的打火机  ·  Eslint semi ...·  1 年前    · 

学C++的时候有时候会对类类型之间的转换感觉到些许的迷惑,下面记录一点点理解和认识

首先需要明白一点:只有子类转换成父类,父类不可能转换成子类。

因为子类是从父类继承而来,子类中包含父类中所有成员。

而如果父类可以转换成子类,意味着将子类中将有一部分是未知的成员。这是不被允许的。

在子类转换成父类的时候,也需要注意,只能是指针或者引用,不能是对象,除非有重写构造函数和赋值函数。

重写函数,这改变不了原理。

在转换成父类的过程中,意味着对子类进行了一个切割,只是将子类中的父类部分赋值给了父类对象。

有时候可以能会看到这样的情景。

Bulk_item bulk;

Item_base *itemp = $bulk;

其中Bulk_item是Item_base的子类。

上面的表示方式是被允许的。但这里需要注意的是,这并不表示子类到父类之间有有任何转换。

要知道指针只是表示地址,什么类型的指针只是表示从当前地址开始,到这个类型空间指针结束的内存块。

这里相当于父类的指针指向子类所存在的地址,然而子类中拥有父类的部分,所以这种转换合法,编译器不会报错。

但是下面这样是不被允许的,尽管itemp指向的是子类类型对象地址。

Bulk_item *bulkp = itemp;

编译器不管是不是正确的,都会报错。原因就不用说了。如果用户确定这种转换是正确的。

可以通过强制转换

Bulk_item *bulk = dynamic_cast<Bulk_item> itemp;

至于使用什么样的强制转换类型自己,看用户自己了。

(1) 子类 对象 既包含 父类 继承来的变量,还包括自身所特有的.当把 子类 对象去赋值给 父类 对象时,把两者共有的部分进行了赋值.(有篇文章反映了两者的内存关系:https://www.cnblogs.com/taiyonghai/p/6515979.html) (2)反之, 父类 对象赋值给 子类 对象时,由于 父类 对象不能够提供 子类 对象所特有的变量,因此会报错. (3)对象指针也有这样的使用规则,... 虚表是 C++ 多态实现的一个重要手段,也是dynamic_cast操作符 转换 能够进行的前提条件。当类没有虚函数表的时候(也即一个虚函数都没有定义),dynamic_cast无法使用RTTI Student s=p; //错误 3.只有 父类 对象指向 子类 ,那么 父类 是可以强制 转换 子类 ,如果 父类 对象没有指向 子类 ,那么强制 转换 就会报错的 Person p=new Person(); Student s=new Student(); s=(stud. Understanding conversions between base and derived types is essential to understanding how object-oriented programming works in C++ . 理解基类类型 我们都知道,实现 子类 父类 转换 比较简单,但如何实现 父类 子类 转换 呢? 现有一个场景如下,假设我有一个类,里边存有海量的数据作为成员变量,例如cv::Mat等等,占用内存大小较大,可能以M或G计,我们想要对其的若干个对象操作,例如排序等等,该操作仅会使用他的部分成员变量,比如时间戳(double)、类型(字符串)、大小(size_t)等等,并且这些成员变量占内存较小,如果直接使用该类进行操作,那么频繁地交换、储存临时变量将占内存比较大,其 一个思路是将其改造为 子类 ,其 父类 仅有需要进行操作的成... 父类 指针和引用可以指向 子类 对象 ,而 子类 对象指针不能直接指向 父类 ,但是可以通过强制 转换 来把 父类 指针 转换 子类 指针。 子类 父类 后能访问的函数是 父类 非虚函数和 子类 虚函数, 父类 子类 后能访问到的是 子类 的非虚函数和继承的 父类 函数。 子类 的虚函数并没有隐藏 父类 的所以访问到的是 父类 虚函数。eg: CFather *pFather = new CFather; // 父类 指针 CSon *pSON = static_cast<CSon *>(pFather); // 父类 子类 pSON->eat 类类型 之间 转换 以下内容是对 C++ Primer的个人总结 主要存在与派生类向基类 转换 ,之所以能够进行派生类向基类 转换 是因为一个派生类对象既包含了自己定义的成员(非静态)的子对象,还包括继承的基类的子对象。也正是因为此,派生类到基类的类型 转换 只对指针或者引用类型有效。可以将派生类对象赋值,拷贝,移动给一个基类对象,但是这只涉及到派生类对象里面的基类部分。 不存在基类向派生类的 转换 的原因:基类对象可以是派生类对象的一部分,也可以不是,如果是后者,那么基类向派生类的 转换 可能造成访问基类里面根本不存在的成员。 子类 对象当 父类 对象使用 1⃣️把 子类 对象直接赋值给 父类 对象(等号左边是 父类 对象,等号右边是 子类 对象) 子类 对象赋值给 父类 对象,仅仅把继承自 父类 部分成员函数赋值给 父类 对象 赋值完成后等号左边依然是一个 父类 对象  Derived d;  Base b;  b=d;//把 子类 对象d当成 父类 对象来使用 ( 父类 对象不能赋值给 子类 对象,也就是说 父类 对象不能当成 子类 对象使用) 2⃣️ 父类 的引用指