有没有办法包装函数调用或重载函数调用?

Is there a way to wrap a function call in or overload a functions call?

我的目标是让一个 class 在 C++ 中继承另一个 class 并以相同的方式重载所有父 class 方法。

所以当一个方法被调用时,一些代码是 运行,原始方法被调用,更多的代码是 运行 全部在派生的 class 重载方法中。

class Base
{
  Base() {}
  ~Base() {}

  void base_method()
  {
    // Does something.
  }
}


template<class T>
class ClassWrapper : public T
{
public:
  ClassWrapper(T base) : T( base ) {}
  ~ClassWrapper() {}

  void wrap_function()
  {
    // multithread block {
    // call base method within multithread block.
      this->base_method();
    // }
  }
}

int main()
{
  Base B;
  ClassWrapper<Base> C( B );

  C.base_method();

  return 0;
}

理想情况下,对基 class 一无所知,但它的所有方法都可以被覆盖。

我不确定这是否可行,但如果有任何建议就太好了!

有了继承,你可能会这样做:

class Base
{
  Base() {}
  virtual ~Base() {}

 virtual void base_method()
  {
    // Does something.
  }
};


class BaseWrapper : public Base
{
public:
  BaseWrapper(Base base) : Bas( base ) {}

  void base_method() override
  {
    // Some code ...
    Base::base_method();
    // Some code ...
  }
}

int main()
{
  Base B;
  BaseWrapper C( B );

  C.base_method();
}

Jarod 的回答非常适合您的问题。但是,我想添加一个更侧重于您选择的设计而不是实现的答案。

尽管您说您想要“以相同的方式重载所有父 class 方法”,但您的目标(“调用原始方法并添加更多代码 运行 all in the derived class重载方法")表示略有不同。

第一个可能表示继承,但第二个可能指向工厂抽象设计模式(继承组合):

#include<iostream>

class AbstractBar
{
public:
  virtual void bar_method() = 0;
};

class Bar1 : public AbstractBar
{
public:
  void bar_method()  { 
  std::cout << "Bar 1" << std::endl; 
  }
};

class Bar2 : public AbstractBar
{
public:
  void bar_method()  {
    std::cout << "Bar 2" << std::endl;
  }
};

class Foo
{
public:
  Foo(AbstractBar* bar_) : bar(bar_) { }
  void foo_method() { 
      bar->bar_method();
      std::cout << "Foo" << std::endl;
  }
private:
  AbstractBar* bar;
};



int main() {
    Bar1 bar;
    Foo foo(&bar);
    foo.foo_method();
}

作为代码的output

Bar 1
Foo

或简化版(根据您的需要):

#include<iostream>

class Bar {
public:
  void bar_method()  {
    std::cout << "Bar" << std::endl;
  }
};

class Foo {
public:
  Foo(Bar* bar_) : bar(bar_) { }
  void foo_method() { 
      bar->bar_method();
      std::cout << "Foo" << std::endl;
  }
private:
  Bar* bar;
};

int main() {
    Bar bar;
    Foo foo(&bar);
    foo.foo_method();
}

通过 CRTP(Curiously Recurring Template Pattern)实现的静态多态性可能对您有所帮助。 阅读有关 CRTP 的更多信息 here and here

假设您有一个 Wrapper class 像:

template <typename Impl>
class Wrapper {
public:
    Wrapper() {}
    ~Wrapper() {}

    void some_preparation() {
        std::cout << "Wrapper work!" << std::endl;
    }
};

然后你有你真正的 class 比如:

class MyFoo : public Wrapper<MyFoo> {
public:
    MyFoo() {}
    ~MyFoo() {}

    void foo() {
        Wrapper::some_preparation();
        std::cout << "Derived work!" << std::endl;
    }
};

最终,您可以使用上面的代码:

MyFoo wrappedFoo;
wrappedFoo.foo();

结果将是:

Wrapper work!
Derived work!