成员函数指针
#include <iostream>
using namespace std;
class Mammal
{
public:
Mammal():itsAge(1){}
virtual ~Mammal(){}
virtual void Speak()const=0;
virtual void Move()const=0;
protected:
int itsAge;
};
class Dog:public Mammal
{
public:
void Speak()const{cout<<"Woof!"<<endl;}
void Move()const{cout<<"Walking to heel.."<<endl;}
};
class Horse :public Mammal
{
public:
void Speak()const{cout<<"Winnie"<<endl;}
void Move()const{cout<<"Galloping.."<<endl;}
};
class Cat:public Mammal
{
public:
void Speak()const{cout<<"Miao"<<endl;}
void Move()const{cout<<cout<<"slinking..."<<endl;}
};
int main()
{
void (*pFunc)()const=0;
Mammal *ptr=0;
int Animal;
int metod;
bool fQuit=false;
while (fQuit==false)
{
cout<<"(0)Quit (1)dog (2)Cat (3)horse:"<<endl;
cin>>Animal;
switch(Animal)
{
case 1:ptr =new Dog;break;
case 2:ptr=new Cat;break;
case 3:ptr=new Horse;break;
default:fQuit=true;break;
}
if (fQuit==false)
{
cout<<"(1)Speak (2)Move"<<endl;
cin>>metod;
switch(metod)
{
case 1:pFunc=Mammal::Speak();break;
default:pFunc=Mammal::Move();break;
}
(ptr ->*pFunc)();
delete ptr;
}
}
return 0;
}
报错:
>e:\c++\learn\test\test\001.cpp(57) : error C2352: “Mammal::Speak”: 非静态成员函数的非法调用
1> e:\c++\learn\test\test\001.cpp(8) : 参见“Mammal::Speak”的声明
1>e:\c++\learn\test\test\001.cpp(58) : error C2352: “Mammal::Move”: 非静态成员函数的非法调用
1> e:\c++\learn\test\test\001.cpp(9) : 参见“Mammal::Move”的声明
1>e:\c++\learn\test\test\001.cpp(60) : error C2039: “pFunc”: 不是“Mammal”的成员
1> e:\c++\learn\test\test\001.cpp(4) : 参见“Mammal”的声明
1>生成日志保存在“file://e:\C++\learn\Test\Test\Debug\BuildLog.htm”
1>Test - 3 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
[解决办法]
#include <iostream>
using namespace std;
class Mammal
{
public:
Mammal():itsAge(1){}
virtual ~Mammal(){}
virtual void Speak()const=0;
virtual void Move()const=0;
protected:
int itsAge;
};
class Dog:public Mammal
{
public:
void Speak()const{cout<<"Woof!"<<endl;}
void Move()const{cout<<"Walking to heel.."<<endl;}
};
class Horse :public Mammal
{
public:
void Speak()const{cout<<"Winnie"<<endl;}
void Move()const{cout<<"Galloping.."<<endl;}
};
class Cat:public Mammal
{
public:
void Speak()const{cout<<"Miao"<<endl;}
void Move()const{cout<<cout<<"slinking..."<<endl;}
};
int main()
{
void (Mammal::*pFunc)()const=0;//这里
Mammal *ptr=0;
int Animal;
int metod;
bool fQuit=false;
while (fQuit==false)
{
cout<<"(0)Quit (1)dog (2)Cat (3)horse:"<<endl;
cin>>Animal;
switch(Animal)
{
case 1:ptr =new Dog;break;
case 2:ptr=new Cat;break;
case 3:ptr=new Horse;break;
default:fQuit=true;break;
}
if (fQuit==false)
{
cout<<"(1)Speak (2)Move"<<endl;
cin>>metod;
switch(metod)
{
case 1:pFunc=&Mammal::Speak;break;//这里
default:pFunc=&Mammal::Move;break;//
}
(ptr ->*pFunc)();
delete ptr;
}
}
return 0;
}