我有一堆类,它们都从一个公共基类继承了相同的属性。基类实现了一些在一般情况下工作的虚函数,而每个子类为各种特殊情况重新实现了这些虚函数。
情况是这样的:我希望这些子类对象的特殊性是可消耗的。本质上,我想实现一个 expend()
函数,它会导致对象失去其子类身份并恢复为基类实例,并在基类中实现一般情况行为。
我应该注意派生类不会引入任何额外的变量,因此基类和派生类在内存中的大小应该相同。
我愿意销毁旧对象并创建一个新对象,只要我可以在相同的内存地址创建新对象,这样现有的指针就不会被破坏。
以下尝试不起作用,并产生一些看似意外的行为。我在这里想念什么?
#include <iostream>
class Base {
public:
virtual void whoami() {
std::cout << "I am Base\n";
}
};
class Derived : public Base {
public:
void whoami() {
std::cout << "I am Derived\n";
}
};
Base* object;
int main() {
object = new Derived; //assign a new Derived class instance
object->whoami(); //this prints "I am Derived"
Base baseObject;
*object = baseObject; //reassign existing object to a different type
object->whoami(); //but it *STILL* prints "I am Derived" (!)
return 0;
}
原文由 Username Obfuscation 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以以破坏良好实践和维护不安全代码为代价。其他答案将为您提供实现此目的的讨厌技巧。
我不喜欢只是说“你不应该那样做”的答案,但我想建议可能有更好的方法来实现你所寻求的结果。
@manni66 在评论中建议的 策略模式 是一个很好的模式。
您还应该考虑 面向数据的设计,因为在您的情况下,类层次结构看起来不是明智的选择。