如何在基类里调用派生类的函数
怎么在基类里调用派生类的函数。
[code=C/C++][/code]
class A
{
};
class B:public A
{
public:
void speek();
};
能够用A调用speak()吗?
------解决方案--------------------
强制转换可以办到
------解决方案--------------------
我可以明确的告诉你,这是可以的!
------解决方案--------------------
[code=C/C++][/code]
class A
{
};
class B:public A
{
public:
void speek();
};
能够用A调用speak()吗?
------解决方案--------------------
强制转换可以办到
------解决方案--------------------
我可以明确的告诉你,这是可以的!
------解决方案--------------------
- C/C++ code
//用virtual 关键字
------解决方案--------------------
------解决方案--------------------
楼上的作法,如果B类包含成员,那么当你声明一个A对象 就会出错
- C/C++ code
#include <stdio.h> template <typename T> class A { public: A() { T *pT = (T *) this; pT->speek(); } }; class B : public A<B> { public: void speek() { a=11000; printf("OK\n"); } //void print() {printf("%d\n",a);} int a; }; int main() { A<B> a; //崩溃 B b; //可以 return 0; }
------解决方案--------------------
这个可以做到,使用成员函数指针实现:
class A
{
public:
typedef void (A::*IFunctor)();
virtual ~A() {}
virtual void Invoke() = 0;
}
class B : public A
{
public:
B()
{
m_functor = (IFunctor)&B::Speek();
}
void Invoke()
{
(this->*m_functor)();
}
void Speek()
{
printf("B::Speek() r\n");
}
private:
IFunctor m_functor;
}
调用方法:
A *pObj = new B();
pObj->Invoke(); // 实际执行的是B::Speek()
这里Invoke相当于一个隔离层。你如果想访问B的多个成员函数的话,可用同样的思路实现。