三行代码  ›  专栏  ›  技术社区  ›  Noideas

访问成员函数指针数组的元素

  •  0
  • Noideas  · 技术社区  · 1 月前

    我在成员函数指针方面遇到了一些问题。我该如何解决这个问题,为什么不起作用?问题就在里面 main() ... 或者我猜是这样!

    #include <iostream>
    #include <functional>
    
    template<typename T>
    using FnctPtr = void(T::*)(); // pointer to member function returning void
    
    class Base {    
    public:
        Base() : vtable_ptr{ &virtual_table[0] } {}
        void foo() {
            std::cout << "Base";
        }
        void x() { 
            std::cout << "X";
        }
    
     
    private:
        // array of pointer to member function returning void
        inline static FnctPtr<Base> virtual_table[2] = { &Base::foo, &Base::x };
    
    public:
        FnctPtr<Base>* vtable_ptr;
    };
    
    class Derived : public Base {
    public:
        Derived() {
            vtable_ptr = reinterpret_cast<FnctPtr<Base>*>(&virtual_table[0]);
        }
        void foo() /* override */ {
            std::cout << "Derived";
        }
    
    public:
        inline static FnctPtr<Derived> virtual_table[2] = { &Derived::foo, &Base::x };
    };
    
    int main() {
        Base* base = new Base();
        base->vtable_ptr[0](); // Issue here
        delete base;
    }
    
    1 回复  |  直到 1 月前
        1
  •  2
  •   Anoop Rana    1 月前

    类型 vtable_ptr void (Base::**)() base->vtable_ptr[0] void (Base::*)() .您用于呼叫的语法不正确。

    我该怎么解决这个问题

    使用 指向成员函数的指针 空(基::*)() 在您的示例中,如下所示:

    (base->*(base->vtable_ptr[0]))();
    

    请注意,没有必要使用 Derived 在您提供的最小可复制示例中初始化。

    Working demo