【发布时间】:2016-04-15 04:41:27
【问题描述】:
简而言之:
对象一旦建立就可以改变类型吗?
我的尝试:
例如给定设计:
(编辑:澄清一下,这是一个策略设计模式的简化示例,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 只适用于非虚拟对象。复制构造函数需要移动现有内存的开销,我也宁愿避免。
【问题讨论】:
标签: c++ class inheritance overriding