請考慮下面的代碼。通過函數指針靜態調用虛函數
#include <iostream>
#include <memory>
struct A {
A() {}
virtual void f() {
std::cout << "A::f" << std::endl;
}
private:
A(const A&);
};
struct B : public A {
virtual void f() {
std::cout << "B::f" << std::endl;
call(&A::f);
}
private:
void call(void (A::*aMethod)()) {
// ...
(static_cast<A&>(*this).*aMethod)();
//(static_cast<A>(*this).*aMethod)(); -> not allowed to copy!
// ...
}
};
void main() {
std::auto_ptr<B> b (new B);
b->f();
}
此代碼遞歸調用相同B::f
方法,直到用完棧,而我想call
方法調用A::f
。也就是說,它應該靜態地調用它,因爲它會一般發生過,我只是寫:
struct B : public A {
virtual void f() {
std::cout << "B::f" << std::endl;
// ...
A::f();
// ...
}
};
我想有call
方法是前因素一些代碼和「靜態調用」這是常見的後原因以f
...
如何靜態調用在運行時決定的虛擬函數?
在`B :: f`中,爲什麼你必須通過`call`和一個函數指針調用函數?爲什麼你不能只是`A :: f();`? (將「之前」和「之後」代碼重構爲一些常用函數或普通類) – 2010-12-03 13:08:48
這可能是我必須做的......方法`call`就是在這裏來分解代碼,但我有沒有意識到我不能使用它,因爲我打算...... – 2010-12-03 13:34:15