C ++ - 更改对象的类型

时间:2016-01-10 23:16:29

标签: c++ class inheritance override

简而言之:

一旦建立,是否可以更改对象的类型?

我尝试了什么:

例如给定设计: (编辑:为了澄清,这是战略设计模式的简化示例,ChangeData做什么并不重要,只有我们可以通过更改_interface来改变它的作用

struct MyClass
{
    int _data;
    MyInterface* _interface;

    void DoChangeData() { Interface->ChangeData(*this); }
};

MyClass x;
x._interface = new DerivedClass1();
x.DoChangeData(); // do something
x._interface = new DerivedClass2();
x.DoChangeData(); // do something else

切换_interface允许我们更改类的操作,但这需要创建包装器方法(DoChangeData)并始终将this指针作为参数传递,这很难看。

我更喜欢的更好的解决方案是:

struct MyClass abstract
{
    int _data;

    virtual void ChangeData() = 0;
};

但是,一旦具体类建立起来,与_interface不同,它就无法改变。看起来应该可以提供不同的派生类,不添加任何新字段。有没有办法在下面实现ChangeClass函数?

DerivedClass1 x;
x.DoChangeData(); // do something
x.ChangeClass(DerivedClass2); // ???
x.DoChangeData(); // do something else

注意我说的是虚拟类,而reinterpret_cast仅适用于非虚拟对象。复制构造函数需要移动现有内存的开销,我也宁愿避免。

2 个答案:

答案 0 :(得分:1)

如果您解释实际问题而不是如何实施解决方案,这似乎可以更好地回答这类问题。

我不清楚DoChangeData应该做什么以及为什么需要MyClass的引用。 问题陈述不够明确,无法得到答案,标题(如上所述)会得到作为答案(在C ++中你不能改变类型,是一种强类型语言),但是我明白不是你要问的。

请澄清问题,以便能得到满意的答案。

顺便说一句,您可能需要查看Visitor design pattern和/或Strategy design pattern

答案 1 :(得分:0)

您可以在MyClass中声明函数指针并更改它们以更改类型。或者使用(const指针)创建自己的vtable到函数指针数组,只需更改此指针即可更改类型。