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

新手上路,请多包涵

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

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

阅读 454
2 个回答

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

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

@manni66 在评论中建议的 策略模式 是一个很好的模式。

您还应该考虑 面向数据的设计,因为在您的情况下,类层次结构看起来不是明智的选择。

原文由 Jean-Bernard Jansen 发布,翻译遵循 CC BY-SA 3.0 许可协议

不,一旦实例化,就不可能更改对象的类型。

*object = baseObject; 不会改变 object 的 _类型_,它只是调用编译器生成的赋值运算符。

如果你写的是另一回事

object = new Base;

(记得调用 delete 自然;当前您的代码泄漏了一个对象)。

从 C++11 开始,您可以将 资源 从一个对象移动到另一个对象;看

http://en.cppreference.com/w/cpp/utility/move

原文由 Bathsheba 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题