继承和多态是c++的灵魂,如何使用c语言模拟这一机制,是使用c语言实现面向对象开发的关键。
一. 不存在继承
/*
class TestClass
{
private:int a;int b;
public:void func0(int param0,int param1);void func1(int param2,int param3);
};
*/
struct TestClass
{int a;int b;
};void TestClass_func0(void *p, int param0,int param1)
{struct TestClass* this = (struct TestClass*)p;//....
}void TestClass_func1(void *p, int param2,int param3)
{struct TestClass* this = (struct TestClass*)p;//....
}int main(int argc,char* argv[])
{struct TestClass t;TestClass_func1(&t,0,0);TestClass_func0(&t,0,0);return 0;
}
二. 存在继承
/*
class Base
{virtual void func(int param);
};class SubA: public Base
{
private:int a;
public:void func(int param) override;
};
class SubB: public Base
{
private:int b;
public:void func(int param) override;
};int main(int argc,char* argv[])
{Base* pb;SubA sa;SubB sb;pb = &sa; pb->func(0);pb = &sb; pb->func(0);
}
*/struct Base
{void(*func)(void* p, int param);
};struct SubA
{struct Base base;int a;
};
void SubA_func(void* p, int param)
{struct SubA* this = (struct SubA*)p;printf("SubA a: %d.\r\n",this->a);
}struct SubB
{struct Base base;int b;
};
void SubB_func(void* p, int param)
{struct SubB* this = (struct SubB*)p;printf("SubB b: %d.\r\n",this->b);
}int main(int argc,char* argv[])
{struct Base* pb;struct SubA sa; sa.base.func = SubA_func;struct SubB sb; sb.base.func = SubB_func;pb = &sa; pb->func(0);pb = &sb; pb->func(0);
}
三. 从C++到C的自动化转换
从第一节和第二节,我们清晰地看到C++和C是如何对应起来的,这个对应过程从侧面也证明了C++是C的超集,C++完全兼容C,C++代码总是可以写成C的形式。但是面对稍微复杂的项目,这个改写过程将变得极其痛苦,而C++编译器一定程度上就是为了将这个过程自动化而出现的,当然我们最终要的不是C的源码,而是能够运行的二进制机器码,所以C++编译器一步到位地生成了机器码,将中间过程封闭起来。了解了这个过程,可以对C与C++之间的关系理解的更为深刻。