65,210
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
class Mammal
{
public:
Mammal():itsAge(1) { cout << "Mammal constructor...\n"; }
virtual ~Mammal() { cout << "Mammal destructor...\n"; }
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 Cat:public Mammal
{
public:
void Speak() const { cout << "Meow!" << endl; }
void Move() const { cout << "slinking..." << endl; }
};
class Horse:public Mammal
{
public:
void Speak() const { cout << "Winnie!" << endl; }
void Move() const { cout << "Galloping..." << endl; }
};
int main()
{
void (Mammal::*pFunc) () const = 0;
Mammal * ptr = 0;
int Animal;
int Method;
bool fQuit = false;
while (fQuit == false)
{
cout << "(0)Quit (1)dog (2)cat (3)horse: ";
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: ";
cin >> Method;
switch (Method)
{
case 1: pFunc = Mammal::Speak; break;
// 在编译的时候这个地方报错:“Mammal::Speak”: 函数调用缺少参数列表请 表;使用“&Mammal::Speak”创建指向成员的指针
default: pFunc = Mammal::Move; break;
}
(ptr->*pFunc)();
delete ptr;
}
}
return 0;
}
楼主所说的问题牵扯到静态编译、动态编译的概念。
普通的函数在预编译时期就确定了函数的重定位地址,而成员函数属于运行时期的地址定位。
Mammal::Speak如此写法,在预编译期间编译器无法确定你的Speak是类成员还是类函数,加上&符号是确切的告诉
编译器,我的&Mammal::Speak给的是个函数的地址而不是一个成员变量,并且给的是个运行时态的地址,编译器
有时也会做出很多匪夷所思的事情,有时必须你明确的告诉它该干什么,不该干什么