普通类成员函数指针
先定义一个公鸡类Cock,只有一个函数Shout,功能是输出一个字符串。
接着定义函数指针类型PFN_Shout。
main函数中代码PFN_Shout pfn_Shout = &Cock::Shout;
和void (Cock:: * pfn_Shout)() = &Cock::Shout;
的功能相同,都是创建一个类成员函数指针对象。最后,是使用对象和对象指针调用函数指针的形式。
#include <iostream>
class Cock {
public:void Shout(){std::cout << "WoWo" << std::endl;}
};
typedef void (Cock::* PFN_Shout)(); // 类Cock成员函数指针类型定义.
int main()
{//PFN_Shout pfn_Shout = &Cock::Shout; // 与下句功能相同void (Cock:: * pfn_Shout)() = &Cock::Shout;Cock cock;(cock.*pfn_Shout)();Cock *pCock = new Cock;(pCock->*pfn_Shout)();
delete pCock;
}
运行结果
WoWo
WoWo
类虚函数函数指针
先定义一个纯虚基类Animal,并声明两个虚方法shout和sing;然后定义Animal的派生类Dog和Cat,并实现上述两个方法。
接下来定义一个动物表演类模板AnimalShow,在类模板的定义中,使用代码:
typedef void (Beast:: * Shout)();
typedef void (Beast:: * Sing)(const char*);
定义了模板参数类的成员函数指针。并定义了方法ShowShout和showSing。
函数main展示了函数指针的用法。
#include <iostream>
class Animal {
public:virtual void shout() = 0;virtual void sing(const char*) = 0;
};
class Dog:public Animal {
public:virtual void shout() {std::cout << "Dog Shout: Wang" << std::endl;}virtual void sing(const char* s) {std::cout << "Dog Sing: " << s << std::endl;}
};
class Cat :public Animal {
public:virtual void shout() {std::cout << "Cat Shout: Miao" << std::endl;}virtual void sing(const char* s) {std::cout << "Cat Sing: " << s << std::endl;}
};
// 动物表演
template <typename Beast>
class AnimalShow {
public:// 成员函数指针typedef void (Beast::* Shout)(); typedef void (Beast::* Sing)(const char*);// 动物喊void ShowShout(Beast* b, Shout s) {(b->*s)();}// 动物唱歌词wordsvoid ShowSing(Beast* b, Sing s, const char* words) {(b->*s)(words);}
};int main()
{Dog* pDog = new Dog;Cat* pCat = new Cat;std::string words;AnimalShow<Dog> dogShow;dogShow.ShowShout(pDog, &Dog::shout);words = "I am a dog!";dogShow.ShowSing(pDog, &Dog::sing, words.c_str());AnimalShow<Cat> catShow;catShow.ShowShout(pCat, &Cat::shout);words = "I am a cat!";catShow.ShowSing(pCat, &Cat::sing, words.c_str());delete pDog;delete pCat;return 1;
}
运行结果
Dog Shout: Wang
Dog Sing: I am a dog!
Cat Shout: Miao
Dog Sing: I am a cat!