C ++重新定义特定对象的类方法

时间:2014-11-28 23:19:01

标签: c++ class pointers object

我的班级foo有一个方法doesSomething()。我构建了所述类的多个对象,但对于一些特定的对象,我希望doesSomething()做其他事情。如何在构造后动态重新定义该方法的主体?

我相信this正是我所寻找的,但它是用Java制作的。

3 个答案:

答案 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();
    }
};