指向基类中成员函数的指针数组
Posted
技术标签:
【中文标题】指向基类中成员函数的指针数组【英文标题】:Array of pointers to member functions in base class 【发布时间】:2016-03-05 15:03:26 【问题描述】:我需要一个指向此类基类中成员函数的指针数组
class Base
public:
typedef int(Base::*func)();
func f[3];
Base();
void run();
;
void Base::run()
cout << (this->*f[0])() << endl;
cout << (this->*f[1])() << endl;
cout << (this->*f[2])() << endl;
函数 run() 对于所有子类都是相同的。但是数组 f[] 中的指针将引用将在子类中定义的成员函数。
class Child: public Base
public:
typedef int(Child::*func)();
func f[3];
int A();
int B();
int C();
Child();
;
int Child::A()
return 1;
int Child::B()
return 2;
int Child::C()
return 3;
Child::Child()
f[0] = &Child::A;
f[1] = &Child::B;
f[2] = &Child::C;
如果我在程序中运行此代码,我会遇到问题
Child x;
x.run();
如何做到这一点?
【问题讨论】:
你看起来像是在尝试重新发明虚函数。 你遇到了什么问题? 程序已运行但操作不正确 【参考方案1】:您在这里面临两个主要障碍。
第一,你永远不会初始化Base::f
,但这就是run
的作用。您在子类中声明一个成员f
并在构造函数中对其进行初始化。 Base
类 f
从未初始化,并且充满了垃圾。当您调用run
时,它会尝试使用这些随机值。这是未定义的行为。
int(Base::*)()
和int(Child::*)()
是两种截然不同且不兼容的类型。您看起来想用指向子函数的指针填充数组并从基类调用它们。
有几种方法可以解决这个问题:
-
您可以将
run
设为虚拟并在子类中实现它以调用函数。
您可以将函数放在基类中并使它们成为虚拟函数,因此指向它们的指针将调用派生版本。
您可以创建一个 std::function
对象数组而不是指针。
【讨论】:
【参考方案2】:这行得通:
class Base
public:
typedef int(Base::*func)();
func f[3];
virtual int A() return 0;
virtual int B() return 0;
virtual int C() return 0;
Base() ;
void run()
cout << (this->*f[0])() << endl;
cout << (this->*f[1])() << endl;
cout << (this->*f[2])() << endl;
;
class Child: public Base
public:
int A() return 1;
int B() return 2;
int C() return 3;
Child()
f[0] = &Base::A;
f[1] = &Base::B;
f[2] = &Base::C;
;
【讨论】:
请解释为什么这样有效,以及为什么原来没有。 这得益于虚函数和后期绑定的机制。以上是关于指向基类中成员函数的指针数组的主要内容,如果未能解决你的问题,请参考以下文章