如何将已实现的虚拟成员函数作为参数传递

时间:2018-06-04 08:37:51

标签: c++ compiler-errors virtual

#include <iostream>

class virtualClass{
public:
    virtual int a() = 0;
};

class UnknownImplementation : public virtualClass{
public:
    int a() override { return 1;}
};

class myFramework {
public:
    int c(int (virtualClass::*implementedFunc)(void)){
        implementedFunc();
        return 2;
    }
};

int main(){
    //some user implements the virtual class and calls myFramework function
    myFramework* mfp = new myFramework();
    std::cout << mfp->c(&(UnknownImplementation::a)) << std::endl;
}

嗨,我正在研究一个假定调用已实现的虚函数并使用它的框架。它类似于上面的代码。 我得到的编译错误是:

  
    

testVirtual.cpp:在成员函数'int myFramework :: c(int(virtualClass :: )())'中:testVirtual.cpp:16:19:错误:必须使用'。'要么     ' - &gt; '在'implementedFunc(...)'中调用指向成员的函数,     例如'(... - &gt; implementedFunc)(...)'implementedFunc();                        ^ testVirtual.cpp:在函数'int main()'中:testVirtual.cpp:24:47:错误:无效使用非静态成员     function'virtual int UnknownImplementation :: a()'std :: cout&lt;&lt;     mfp-&gt; c(&amp;(UnknownImplementation :: a))&lt;&lt;的std :: ENDL;

  

如何解决这些问题? 提前谢谢!

传递已实现类的实例并调用该函数。

1 个答案:

答案 0 :(得分:1)

要构建sameerkn的注释,此代码应为:

#include <iostream>

class virtualClass{
public:
    virtual int a() = 0;
};

class mySubclass : public virtualClass{
public:
    int a() override { return 1;}
};

int main(){
    mySubclass * x= new mySubclass ();

    // ...

    std::cout << x->a () << std::endl;
}

这里的要点是你可以传递virtualClass类型的对象(或指针) - 即使它们在现实生活中可能实际上是mySubclass个对象 - 并且仍然可以在正确的实现中实现a()myFramework完全没必要。

这就是virtual方法的用途 - virtualClass的消费者不需要知道任何可能 - 现在或将来 - 从中​​派生的类,如果我已经阅读过问题正确,这就是你想要的。