我的班级foo
有一个方法doesSomething()
。我构建了所述类的多个对象,但对于一些特定的对象,我希望doesSomething()
做其他事情。如何在构造后动态重新定义该方法的主体?
我相信this正是我所寻找的,但它是用Java制作的。
答案 0 :(得分:0)
如果要“覆盖”以前的类定义,可以使用虚函数,并使用派生类。
Here你有一些例子,特别是在“虚拟成员”标题下。
祝你好运。答案 1 :(得分:0)
struct nasty_object {
nasty_object()
: _something_do { std::bind(&nasty_object::normal_thing, this) }
{
}
void normal_thing() {
// the stuff to do in the default case
}
void do_other_thing() {
// the stuff to do in the alternate case
}
void do_something() {
if(_something_do) {
_something_do();
}
}
// replace the meaning of 'do_something()'
void set_do_something(std::function<void()> f)
{
_something_do(std::move(f));
}
private:
std::function<void()> _something_do;
};
现在您可以在运行时创建对象并更改do_something()的含义,如下所示
auto n1 = nasty_object{};
auto n2 = nasty_object{};
auto n3 = nasty_object{};
n2.set_do_something(std::bind(&nasty_object::do_other_thing, &n2));
n3.set_do_something([&n3] {
// do something totally different!
});
n1.do_something(); // does something
n2.do_something(); // does the other thing
n3.do_something(); // does whatever was in your lambda
注意:仅仅因为可以使用c ++执行此操作并不意味着您应该这样做。这种不负责任的行为最好留给剧本骑师和其他人没有好处。
答案 2 :(得分:0)
在C ++中,对象不具有对方法的引用,它们引用了&#34;虚函数表&#34; aka&#34; classes&#34;。所以你需要让另一个班级以你想象的方式去做。但是你也说你想在构造对象后改变它 - 这意味着你不能使用虚函数来做它。相反,你应该使用函数指针,甚至只是一个简单的布尔值:
class C {
bool isSpecial;
void doesSomethingNormal() { ... }
void doesSomethingSpecial() { ... }
void doesSomething() {
if (isSpecial)
doesSomethingSpecial();
else doesSomethingNormal();
}
};