关于怎么在不使用虚函数的情况上父类调用子类成员函数的有关问题

关于如何在不使用虚函数的情况下父类调用子类成员函数的问题

最近论坛有人讨论父类调用子类函数的问题,现整理如下:

问题:

class A
{

};
class B:public A
{
public:
  void speek();

};
除了强制类型转换之外,能够用A调用speak()吗?

方法一、 用模板类

代码如下:

#include "stdafx.h"
#include <stdio.h>


template <typename T>
class A
{
public:
    A()
    {
        pT = (T *) this;
    }
test()
{
pT->speek();
};
T* pT;
};


class B    :    public A<B>
{
public:
    void speek()
    {
m_b = 0;
        printf("OK\n");
    }
public:
int m_b;
};




int main(int argc, char* argv[])
{
printf("Hello World!\n");


B b;
b.m_b = 100;
A<B> a(b);
a.test();
b.m_b = 99;


return 0;
}


方法二、 用成员函数指针实现

代码如下:

#include "stdafx.h"




class A
{
public:
typedef void (A::*IFunctor)();
virtual ~A() {};
virtual void Invoke()
{
(this->*m_functor)();
};
protected:
IFunctor m_functor;
};


class B : public A
{
public:
B()
{
m_functor = (IFunctor)&B::Speek;
}

void Speek()
{
printf("B::Speek() \r\n");
}
};

int main(int argc, char* argv[])
{
A *pObj = new B();
pObj->Invoke(); // 实际执行的是B::Speek()




printf("Hello World!\n");


return 0;
}


1楼Wentasy3小时前
学习了。