上文的 uri 分析中我们发现结构体总是有一个指针,注释写的很明白,是一个虚拟函数指针,和C++中的虚表中却是十分想像。
不此在 PJSIP 中十分常见,在 Android 源码中,还有其它的开源工程也是很常见的。好的,写个简单工程来解释疑惑。
/**
* 用 c 语言实现类的继承,并且可用父类指针操作子类对像的一个测试例子
*
* @Author: tomken.zhang
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义一个动物类,有二个方法
struct v_animal_ptr {
const char* (*get_name)(); // 获取名字
void (*shout)(int volume); // 喊叫
};
typedef struct v_animal_ptr animal_vptr;
typedef const char* (*GET_NAME)();
typedef void (*SHOUT)(int volume);
// 定义一个动物类
struct animal {
animal_vptr *vptr;
};
static const char* animal_get_name(const void *class)
{
return (*((struct animal*)class)->vptr->get_name)();
}
static void animal_shout(const void *class, int volume)
{
return (*((struct animal*)class)->vptr->shout)(volume);
}
// 定义一个猪类,有一个高度值。
struct pig {
ani