【问题标题】:How to pass an implemented virtual member function as a parameter如何将实现的虚拟成员函数作为参数传递
【发布时间】:2018-06-04 08:37:50
【问题描述】:
#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:错误:必须使用'.'或者 ‘->’ 在 ‘implementedFunc (...)’ 中调用指向成员函数的指针, 例如'(... -> 已实现的Func) (...)' 已实现的Func(); ^ testVirtual.cpp:在函数“int main()”中:testVirtual.cpp:24:47:错误:非静态成员的使用无效 函数‘virtual int UnknownImplementation::a()’ std::cout c(&(UnknownImplementation::a))

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

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

【问题讨论】:

  • 最好传递UnknownImplementation的对象并在myFramework::c内调用virtualClass的相应函数。因为virtualClass 的每个实现都会定义可以从myFramework::c 中调用的函数。这称为命令模式。
  • 行了,谢谢

标签: c++ compiler-errors virtual


【解决方案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 的消费者不需要知道任何关于现在或将来可能从它派生的类,如果我正确阅读了你的问题,这个就是你想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 2019-09-27
    • 1970-01-01
    相关资源
    最近更新 更多