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

Posted

技术标签:

【中文标题】C++ 多态静态可变子函数指针【英文标题】:C++ Polymorphic Static Changeable Child Function Pointer 【发布时间】:2018-03-16 22:01:18 【问题描述】:

我有一个类 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

【问题讨论】:

如果我创建一个B 对象,并将其传递给一个接受A&amp; 引用的函数,并且该函数使用来自该对象引用的指针,它是否应该看到与@ 关联的指针987654325@ 对象或与B 对象关联的指针? 我认为您不能将 B 传递给 func(A&) 因为 A 是孩子,但如果可以的话,我想要 B 的指针 哎呀,是的,我把那些倒过来了。 【参考方案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;

【讨论】:

如果没有唯一命名的函数指针,你能做到吗? @JesseMcDonald 是的,A、B、C 中的函数指针都可以同名。 好的,当我厌倦的时候我发现了我的问题...我把多态部分搞砸了,所以它看起来好像不起作用......

以上是关于C++ 多态静态可变子函数指针的主要内容,如果未能解决你的问题,请参考以下文章

c++中为啥要用new 函数()实现多态?

虚函数探秘

C++多态 --- 多态实现原理简析

c++八股之多态(持续更新)

[C++]——多态虚函数虚指针

[C++]——多态虚函数虚指针