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

时间:2014-04-15 11:36:43

标签: c++ inheritance polymorphism

我们假设我有一个名为Animal的基类和一个继承自Dog的班级Animal

然后我创建了一个基类。

Animal* pAnimal = new Animal();

之后我为这个班级设置了一堆数据。

pAnimal->SetName("SomeAnimal");

现在,我想将此Animal类转换为Dog并保留Animal上设置的所有数据。这可以在不创建新的Dog类并且基本上复制所有数据的情况下完成吗?

希望你能理解我的问题,我基本上想要"推广"将基类放入子类中而不必复制所有基类的现有数据。我不确定这是否可行,因为我不知道如何做到这一点。

1 个答案:

答案 0 :(得分:0)

没有。这不可以。请记住,在C ++中完成OOP的所有语法糖背后发生的事情并不神奇。成员变量仍占用内存中的物理地址。两个派生类可能不会在内存中具有相同的变量类型和对齐,甚至可以使清理转换成为可能。一旦你使用多态函数接口(虚函数),问题只会包含实现虚函数的机制(通常,它是一个vtable)。

正如其他人提到的那样,你可以派生出一个共同的基类,并在派生类型之间进行转换,并且只有这么多是#34;别名"通过不同的类型,但所有派生的数据仍然像以前一样(所以在不久之前在同一个内存上创建一只猫是不安全的。)

请记住,OOP的强大之处在于,通过能够在派生类中访问相同的成员变量,您可以减少工作量,您可以对接口进行编码并且测试逻辑是否正常工作并且对不同的派生类型使用相同的接口调用应该以相同的方式工作。

例如,想象一下,我们在一个非常复杂的系统中有一段代码,其中一部分就是喂宠物。麻烦的是猫需要喂养不同于狗,狗不同于鸟类,鸟类不同于海龟等等。通过多态函数,我们复杂的系统可以简单地说类似

animal->feed();

让派生类弄清楚如何实际完成这项工作。现在,我们的复杂系统并不需要具备在控制路径中喂养数十亿种动物以喂养动物的所有逻辑。因此,当您需要添加新的动物类型时,您不需要在代码中搜索所有需要特定动物类型知识的地方来完成工作(喂养,清洁,打扮,娱乐,等等。)。你只需让新派生的动物类描述如何完成这种行为(再次:喂食,清洁....),你的控制路径直到我们复杂系统中的那些功能保持不变。