gpt4 book ai didi

c++ - 实例化后是否可以更改 C++ 对象的类?

转载 作者:IT老高 更新时间:2023-10-28 14:01:37 25 4
gpt4 key购买 nike

我有一堆类,它们都从一个公共(public)基类继承了相同的属性。基类实现了一些在一般情况下工作的虚函数,而每个子类为各种特殊情况重新实现了这些虚函数。

情况如下:我希望这些子类对象的特殊性是可消耗的。本质上,我想实现一个 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;
}

最佳答案

您可以以破坏良好做法和维护不安全代码为代价。其他答案将为您提供实现此目的的讨厌技巧。

我不喜欢只是说“你不应该那样做”的答案,但我想建议可能有更好的方法来实现你所寻求的结果。

strategy pattern正如@manni66 的评论所建议的那样,这是一个很好的建议。

您还应该考虑data oriented design ,因为在您的情况下,类层次结构看起来不是一个明智的选择。

关于c++ - 实例化后是否可以更改 C++ 对象的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41220046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com