奇怪的 C 风格继承写法
作者:互联网
一个方法是,Node
是父类,GNode,TreeNode
都是子类,在子类中定义一个父类结构体
成员函数的话,在父类中定义函数指针,对于不同的子类将他指向不同的函数
如果函数非常多可以再开函数表结构体
struct Node;
struct Node{
int dis;
void (*work)();
inline Node(){dis=INT_INF;}
};
struct GNode{
int id;
Node node;
inline GNode(){}
inline GNode(int _id){id=_id;node.work=workGNode;}
};
struct TreeNode{
TreeNode *ls,*rs;
GNode *pos;
int lx,ly,rx,ry;
Node node;
inline TreeNode(){lx=ly=rx=ry=0;ls=rs=NULL;pos=NULL;node.work=workTreeNode;}
};
将多个继承同一父类的子类一起储存时,直接储存他们的父类指针,可以通过定义宏 container
来通过父类指针、子类类型、父类指针在子类类型中的变量名,来获得对应的子类指针
#undef offsetof
#define offsetof(type,member) ((size_t)&(((type*)0)->member))
#define container(ptr,type,member) ({const __typeof__(((type*)0)->member) *__mptr=(ptr);\
(type*)((char*)__mptr-offsetof(type,member));})
这里在 c++ 中使用 __typeof__
来替代 c 中的 typeof
宏中先定义了一个父类类型的指针 __mptr
,并初始化为要获取的子类中的那个父类的地址
然后将 __mptr
减去父类类型指针在子类中的地址的偏移量,就得到结果
地址的偏移量由 offsetof
得到,若地址 0 处是一个子类结构体,那么直接返回这个结构体中那个父类类型指针的地址即可
虽然不能访问地址 0 附近的内存,但是这里只取它的地址获得取它的类型是没问题的
可以继续上面那个例子,比如:
Node *_u;
...
TreeNode *u=container(_u,TreeNode,node);
标签:__,Node,TreeNode,继承,子类,type,父类,写法,奇怪 来源: https://www.cnblogs.com/suxxsfe/p/16419614.html