C 为什么要弄出虚表这个东西?
扫描二维码
随时随地手机看文章
首先声明一点,虚表并非是C 语言的官方标准的一部分,只是各家编译器厂商在实现多态时的解决方案。另外即使同为虚表不同的编译器对于虚表的设计可能也是不同的,本文主要基于Itanium C ABI
(适用于gcc和clang)。
从C的POD类型到C 的类
首先回顾一下C语言纯POD的结构体(struct)。如果用C语言实现一个类似面向对象的类,应该怎么做呢?写法一
#include
typedef struct Actress {
int height; // 身高
int weight; // 体重
int age; // 年龄(注意,这不是数据库,不必一定存储生日)
void (*desc)(struct Actress*);
} Actress;
// obj中各个字段的值不一定被初始化过,
// 通常还会在类内定义一个类似构造函数的函数指针,这里简化
void profile(Actress* obj) {
printf("height:%d weight:%d age:%d\n", obj->height, obj->weight, obj->age);
}
int main() {
Actress a;
a.height = 168;
a.weight = 50;
a.age = 20;
a.desc = profile;
a.desc(