如何将基类更改为继承类

How do I change a base class into an inherited class?

本文关键字:继承 基类      更新时间:2023-10-16

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

然后我创建一个基类。

Animal* pAnimal = new Animal();

之后,我为这个类设置了一堆数据。

pAnimal->SetName("SomeAnimal");

现在我想把这个Animal类变成Dog,并保留在Animal上设置的所有数据。这能在不创建新的Dog类并基本上复制所有数据的情况下完成吗?

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

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

正如其他人所暗示的,你可以从一个公共基类派生,并在派生类型之间进行强制转换,只需要用不同的类型"别名化"这么多,但所有派生数据仍然和以前一样(所以在刚才还是狗的同一内存上创建一只猫是不安全的)。

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

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

animal->feed();

让派生类找出如何真正完成这项工作。现在,我们复杂的系统不需要在喂养动物的控制路径上拥有喂养数十亿种动物的所有逻辑。所以当你需要添加一种新的动物类型时,你不需要在代码中寻找所有需要动物类型特定知识来完成工作(喂食、清洁、打扮、娱乐等)的地方。你只需要让新派生的动物类描述如何完成行为(再次:喂食、清洁……),你在复杂系统中实现这些功能的控制路径保持不变。