如果我有一个纯虚函数可以用函数指针覆盖吗?下面的场景(我知道它在语法上不是正确的):
#include<iostream>
using namespace std;
class A {
public:
virtual void foo() = 0;
};
class B : public A {
public:
B() { foo = &B::caseOne; }
void caseOne() { cout << "Hello One" << endl; }
void caseTwo() { cout << "Hello Two" << endl; }
void (B::*foo)();
void chooseOne() { foo = &B::caseOne; }
void chooseTwo() { foo = &B::caseTwo; }
};
int main() {
B b;
b.(*foo)();
}
编辑:如果有人感兴趣,这就是我如何完成我想做的事情:
#include<iostream>
using namespace std;
class A {
public:
virtual void foo() = 0;
};
class B : public A {
public:
B() { f = &B::caseOne; }
void caseOne() { cout << "Hello One" << endl; }
void caseTwo() { cout << "Hello Two" << endl; }
void (B::*f)();
void chooseOne() { f = &B::caseOne; }
void chooseTwo() { f = &B::caseTwo; }
void foo() { (this->*f)(); }
};
int main() {
B b;
b.foo();
b.chooseTwo();
b.foo();
}
输出结果为:
Hello One
Hello Two
答案 0 :(得分:2)
没有。你用错了。在你的代码中,你试图将成员函数指针分配给函数指针 - 它不能被编译。
C ++ 03标准10.3 / 2
如果虚拟成员函数vf在类Base 和Derived类中声明,则直接派生或 间接来自Base,具有与Base :: vf相同名称和相同参数列表的成员函数vf 声明,然后Derived :: vf也是虚拟的(无论是否声明)并覆盖它 基:: VF 强>
答案 1 :(得分:2)
正如@ForEveR所说,你的代码无法编译。但是,由于您实际需要的是能够在运行时中切换B
foo
的实现,我们确实有解决方法:
#include <iostream>
using namespace std;
class A {
public:
virtual void foo() = 0;
};
class B : public A {
private:
void (B::*_f)();
public:
B() { chooseOne(); }
void caseOne() {
cout << "case one" << endl;
}
void caseTwo() {
cout << "case two" << endl;
}
void chooseOne() { _f = &B::caseOne; }
void chooseTwo() { _f = &B::caseTwo; }
void foo() {
(this->*_f)();
}
};
int main(int argc, const char *argv[])
{
A* b = new B();
b->foo();
((B*)b)->chooseTwo();
b->foo();
return 0;
}
<强>更新强>:
刚刚发现OP在问题中添加了他的答案,这与我的几乎相同。但我认为通过指针而不是实例对象调用foo
更好,因为它可以表现出多态性的影响。此外,最好将f
隐藏为私有成员函数。
答案 2 :(得分:0)
我认为在编译时,语法无法编译。您应该提供具有特定名称和相同args列表的覆盖功能。