在mfc中,判断父类和子类是否存在继承关系是通过静态变量来完成的。举个例子来说,所有子类到父类之间是通过一条链表串联在一起的。如果子类可以通过链表访问到父类的指针,那么我们说两者之间存在继承关系,否则没有继承关系。
那么,既然父类和子类是通过链表串在一起的,那么这是怎么实现的呢?关键就在静态变量。我们知道,类的静态变量是被所有类共享的,因此掌握了静态变量,就可以将父类和子类串在一起了。下面有一段示例代码,大家可以了解一下。
#include <iostream>
using namespace std;
struct runclass {
char name[64];
struct runclass* next;
};
#define CREATE_RUNCLASS(basic) \
static runclass run_##basic; \
static runclass* get_run_class() {return &run_##basic;}
class cobject{
public:
CREATE_RUNCLASS(cobject)
public:
cobject() {}
virtual ~cobject() {}
};
runclass cobject::run_cobject = {"cobject", NULL};
#define IMPLEMENT_RUN_CLASS(basic, origin) \
runclass basic::run_##basic = {#basic, &origin::run_##origin}
class ctemplate : public cobject {
public:
ctemplate() {}
~ctemplate() {}
CREATE_RUNCLASS(ctemplate)
};
IMPLEMENT_RUN_CLASS(ctemplate, cobject);
bool
isKindOf(runclass* basic, runclass* origin){
if(NULL == basic || NULL == origin)
return false;
while(basic->next)
basic = basic->next;
return 0 == strcmp(basic->name, origin->name) ? true :false;
}
int
main(int argc, char* argv[]){
cout << cobject::get_run_class() << endl;
cout << ctemplate::get_run_class() << endl;
return 0;
}