繁体   English   中英

如何将基类更改为继承的类?

[英]How do I change a base class into an inherited class?

假设我有一个称为Animal的基类和一个从Animal继承的Dog类。

然后,我创建一个基类。

Animal* pAnimal = new Animal();

之后,我为该类设置了一些数据。

pAnimal->SetName("SomeAnimal");

现在,我想将这个Animal类变成Dog并保留在Animal设置的所有数据。 可以在不创建新的Dog类并且实质上不复制所有数据的情况下完成此操作吗?

希望您能理解我的问题,我本质上是想将基类“提升”为子类,而不必复制现有的所有基类数据。 我不确定这是否可行,因为我不知道有什么办法。

不,它不能。 请记住,完成OOP的C ++所有语法糖背后发生的事情并不是魔术。 成员变量仍占据内存中的物理地址。 两个派生类可能在内存中没有相同的变量类型和对齐方式,甚至无法进行干净的转换。 一旦使用了多态函数接口(虚拟函数),问题就只会通过包含实现虚拟函数的机制(通常是vtable)而变得更加复杂。

正如其他人提到的那样,您可以派生一个通用的基类,并在派生类型之间进行强制转换,并且只用其他类型来“别名”该对象,但是所有派生数据仍然像以前一样(因此创建一个猫与刚才的狗一样的记忆是不安全的)。

记住,OOP的强大功能不是通过访问派生类中的相同成员变量来减少工作量,而是可以对接口进行编码,并且该逻辑已经过测试,并且可以在不同的接口上使用相同的接口调用派生类型应该以相同的方式工作。

例如,假设我们在一个非常复杂的系统中有一段代码,其中一部分就是养宠物。 问题是猫的饲喂方法与狗不同,狗的饲喂方法与鸟类不同,鸟的饲喂方法与乌龟不同,等等。通过多态功能,我们复杂的系统可以简单地说出类似

animal->feed();

并让派生类弄清楚如何真正完成该工作。 现在,我们复杂的系统不需要在喂养动物的控制路径中拥有所有逻辑来喂养数十亿种动物。 因此,当您需要添加新的动物类型时,无需遍历代码中所有需要了解动物类型的特定知识即可完成工作(喂养,清洁,引诱,娱乐等)的地方。 )。 您只需让新的派生动物类描述如何完成该行为(再次:进食,清洁...),而在复杂系统中达到这些功能的控制路径将保持不变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM