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;
}
Другие вопросы по тегам