C++ Полиморфный статический изменяемый указатель на дочернюю функцию
У меня есть класс A, который является потомком класса B, мне нужно, чтобы у всех детей класса B был указатель на функцию для обработки класса, который может быть изменен внешней функцией в другом файле после компиляции классов. Все экземпляры класса A должны указывать на одну функцию, а все экземпляры B должны указывать на функцию, но A и B должны иметь возможность указывать на разные функции. Как я могу это сделать? Я пробовал указатель статической функции и частный указатель статической функции, но ни один из них не сработал.
class B{
public:
static void (* func)();
}
class A : public B{
}
class C : public B{
}
void funcA(){
cout<<"A"<<endl;
}
void funcB(){
cout<<"B"<<endl;
}
void funcC(){
cout<<"C"<<endl;
}
void main(){
B b=B();
B b2=B();
B a=A();
B a2=A();
B c=C();
B c2=C();
b.func=funcB;
a.func=funcA;
c.func=funcC;
a.func();
b.func();
c.func();
a2.func();
b2.func();
c2.func();
}
Мой желаемый результат
B
A
C
B
A
C
1 ответ
Если вы хотите, чтобы все экземпляры производного класса совместно использовали один и тот же указатель на функцию, вам нужно поместить один указатель на функцию в каждый класс.
Из вашего вопроса не ясно, хотите ли вы полиморфного поведения от классов, но я предположил, что в этом ответе. Если вы комбинируете виртуальные функции и статический указатель на функцию, вы можете получить поведение, которое вы ищете.
#include <iostream>
using fptr = void (*)();
class B {
public:
virtual void func() {
bfunc();
}
static fptr bfunc;
};
fptr B::bfunc;
class A : public B{
public:
void func() override {
afunc();
}
static fptr afunc;
};
fptr A::afunc;
class C : public B{
public:
void func() override {
cfunc();
}
static fptr cfunc;
};
fptr C::cfunc;
void funcA(){
std::cout<<"A"<<std::endl;
}
void funcB(){
std::cout<<"B"<<std::endl;
}
void funcC(){
std::cout<<"C"<<std::endl;
}
int main(){
B b=B();
B b2=B();
A a=A();
A a2=A();
C c=C();
C c2=C();
B::bfunc=funcB;
A::afunc=funcA;
C::cfunc=funcC;
a.func();
b.func();
c.func();
a2.func();
b2.func();
c2.func();
B* c3 = new C;
c3->func();
delete c3;
}