先学习一个简单的例子。
公鸡会喔喔叫。
在Win10中使用VS2022编程实验。
在VS2022中新建C++空项目,添加源文件“main.cpp”,输入如下代码:
#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;
}
先定义一个公鸡类Cock,只有一个函数Shout,功能是输出一个字符串。
接着定义函数指针类型PFN_Shout。
main函数中代码“PFN_Shout pfn_Shout = &Cock::Shout;”和“void (Cock:: * pfn_Shout)() = &Cock::Shout;”的功能相同,都是创建一个类成员函数指针对象。最后,是使用对象和对象指针调用函数指针的形式。程序执行结果如下
第二个例子,是参考设计模式一书中Command模式的例子编写的。
在VS2022中新建C++空项目,添加源文件“main.cpp”,输入如下代码:
#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)();
}
// 动物唱歌词words
void 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;
}
先定义一个纯虚基类Animal,并声明两个虚方法shout和sing;然后定义Animal的派生类Dog和Cat,并实现上述两个方法。
接下来定义一个动物表演类模板AnimalShow,在类模板的定义中,使用代码:
typedef void (Beast::* Shout)();
typedef void (Beast::* Sing)(const char*);
定义了模板参数类的成员函数指针。并定义了方法ShowShout和showSing。
函数main展示了函数指针的用法。
上述程序执行结果如下图所示: