注册/更改c++中其他类的方法



我想知道从另一个类中分配/覆盖方法的正确方法是什么。例如,下面的类A和B不是也不应该被子类化,但是方法A。是一个原型,应该在b的初始化时赋值/设置,即"foo = B.bar_b"(或C或D等)。(总体思路是将服务器(B)的发送方法注册到客户端(a)。)

class A {
public:
virtual void foo(arg argA) {
// empty
};
};
class B {
public:
B(A a) {
a.foo = &B::bar_b;
}
void bar_b(arg argA) {
// do stuff B
};
};
A a;
B b(a);
a.foo(arg) // calls bar_b

它不是这样工作的。有两种方法可以回答你的问题。首先是使用适当的重写:

class A {
public:
virtual void foo() {
// empty
};
};
class B : public A {
public:
void foo() override {
// do stuff B
};
};
B b;
A& b_ref = b;
b_ref.foo();   // calls B::foo

另一种方法是试图解释你真正想做什么。也许你想在运行时交换一些实现来选择A::foo实际在做什么。

你需要一个B来调用类B的方法。此外,B(A a)通过值传递A,并且构造函数中的赋值不会对您传递的A产生任何影响。但是,最重要的是,您不能动态地分配成员函数。但是,您可以给成员变量赋值:

#include <functional>
struct A {
public:
void foo() {
do_foo();
};
std::function<void()> do_foo;
};
class B {
public:
B() = default;
B(A& a) {
a.do_foo = [](){B b; b.bar_b(); };
}
void bar_b() {};
};

相关内容

最新更新