C++ 多态静态可变子函数指针

标签 c++ inheritance polymorphism function-pointers static-polymorphism

我有一个 A 类是 B 类的子类,我需要 B 类的所有子类都有一个指向函数的函数指针,该函数在类具有后可由不同文件中的外部函数更改被编译。 A类的所有实例都应该指向一个函数,B类的所有实例都应该指向一个函数,但是A和B应该可以指向不同的函数。我怎样才能做到这一点?我尝试了静态函数指针和私有(private)静态函数指针,但都没有用。

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

最佳答案

如果您希望派生类的所有实例共享相同的函数指针,您需要在每个类中放置一个函数指针。

如果您想从类中获得多态行为,您的问题并不清楚,但我在这个答案中是这样假设的。如果将虚函数和静态函数指针组合在一起,您可以获得所需的行为。

#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;
}

关于C++ 多态静态可变子函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49330105/

相关文章:

c++ - 如何将齐次 fusion::vector 转换为 (std/boost)::数组

c++ - 如何在程序中改变多维数组的大小?

c++ - 在此范围内未声明构造函数 'cout'

java - 关于Java多态性应用于Calendar和GregoriaCalendar案例的一些疑问

c++ - 执行 "delete this"时缺少虚拟析构函数

php - 复杂的 Laravel 关系

C++:二进制搜索字符串的一部分

c++ - 静态链接的提升正则表达式不工作

javascript - 如何console.log所有继承的属性?

c# - 当我创建继承自 Form 的新类时,Visual Studio 会更改设计器生成的代码