#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;
如何解决这些问题? 提前谢谢!
传递已实现类的实例并调用该函数。
答案 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
的消费者不需要知道任何可能 - 现在或将来 - 从中派生的类,如果我已经阅读过问题正确,这就是你想要的。