(1/2)類型 普通函數指針不能被賦值為成員函數的地址。 int (*pFunc)(); pFunc是一個函數指針,而int (*)()是類型。 成員函數地址要賦值給成員函數指針。 class Base { public: int func() { return 1; } }; int main()
(1/2)類型
普通函數指針不能被賦值為成員函數的地址。
int (*pFunc)();
pFunc是一個函數指針,而int (*)()是類型。
成員函數地址要賦值給成員函數指針。
class Base { public: int func() { return 1; } }; int main() { int (*pFunc)(); pFunc = &Base::func; //error: cannot convert 'int (Base::*)()' to 'int (*)()' in assignment return 0; }
class Base { public: int func() { return 1; } }; int main() { int (Base::*pFunc)(); // OK pFunc = &Base::func; return 0; }
再來:
class Base { public: int func() { return 1; } }; class Derived : public Base { public: int foo() { return 1; } }; int main() { typedef int (Base::*FuncPtr)(); FuncPtr fPtr = &Derived::foo; // error return 0; }
需進行強制類型轉換
......
FuncPtr fPtr = (FuncPtr)&Derived::foo; // OK
反過來,基類成員函數地址可賦值給指向派生類成員函數的指針。
class Base { public: int func() { return 1; } }; class Derived : public Base { public: int foo() { return 1; } }; int main() { typedef int (Derived::*FuncPtr)(); FuncPtr fPtr = &Base::func; // OK return 0; }
(2/2)調用
class Base { public: virtual void func(int i) { cout << "Base: " << i << endl; } }; class Derived : public Base { public: virtual void func(int i) { cout << "Derived: " << i << endl; } }; int main() { typedef void (Base::*FuncPtr)(int); FuncPtr fPtr = &Base::func; Base b; (b.*fPtr)(2); Derived* dPtr = new Derived(); (dPtr->*fPtr)(2); Base* bPtr = new Derived(); (bPtr->*fPtr)(2); return 0; }
output:
Base: 2
Derived: 2
Derived: 2