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

How to pass an implemented virtual member function as a parameter

本文关键字:函数 参数传递 虚拟成员 实现      更新时间:2023-10-16
#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: error: 必须使用 '.'或 "->"在"实现的 Func (...("中调用指向成员的指针函数, 例如,"(... ->实现的 Func( (...(' 实现 Func((; ^ testVirtual.cpp: 在函数 'int main((' 中: testVirtual.cpp:24:47: error: 无效使用非静态成员 函数 'virtual int UnknownImplementation::a((' std::cout <<mfp->c(&(UnknownImplementation::a(( <<std::endl;

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

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

为了构建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的消费者不需要了解任何可能 - 现在或将来 - 从中派生的类,如果我正确阅读了您的问题,这就是您想要的。