抽点空把这个帖子搞完
==================================
前面说到了oop的本质,现在我们考虑用C语言来实现。
再来想想之前所设计的,用struct进行封装。假设有struct A和struct B,我要用A作为B的父类,应该这么考虑呢?很简单,通过B可以找到A。你可能回想直接在B里面插入struct A即可,但是这样的话每次声明一个struct B变量都会对应产生一个A变量,这样会导致对A类型的复制。我们说了,oop一个重要目的是实现代码的重用,如果我声明了两个struct B变量,它们之间就会产生两个struct A变量(嵌套在struct B结构体中),这样可不是重用。因此最好的办法是使用指针。但是,struct A只是个定义,本身没有地址,指针应该指向哪里呢?
现在我们再来思考一下oop的本质,A作为B的父类,意义在于B可以在A里面找到对应的属性,可见类A是什么东西并不重要,类A并不一定非要是个抽象定义,假如它本身就是一段数据(即在内存中占据一段空间),那么我们就可以在里面搜索了(就像函数一样),因此我们考虑声明struct A后,立即定义struct A classA;将classA看作类A,同时声明struct B classB;将classB看作类B,这样就可以在classB中插入classA的指针,通过这个指针找到classA中的属性。
但这样还是有问题,例如,我希望找到classB.k,但是k在classA中,很明显是无法调用的,你可能需要写个类似classB.pA->k的结构来找到k,但这样写就失去了继承的意义,或者说根本不是继承。由此可见,想用struct模拟出类来基本上是不现实的,我们应该使用其他方法来实现。
==================================
前面说到了oop的本质,现在我们考虑用C语言来实现。
再来想想之前所设计的,用struct进行封装。假设有struct A和struct B,我要用A作为B的父类,应该这么考虑呢?很简单,通过B可以找到A。你可能回想直接在B里面插入struct A即可,但是这样的话每次声明一个struct B变量都会对应产生一个A变量,这样会导致对A类型的复制。我们说了,oop一个重要目的是实现代码的重用,如果我声明了两个struct B变量,它们之间就会产生两个struct A变量(嵌套在struct B结构体中),这样可不是重用。因此最好的办法是使用指针。但是,struct A只是个定义,本身没有地址,指针应该指向哪里呢?
现在我们再来思考一下oop的本质,A作为B的父类,意义在于B可以在A里面找到对应的属性,可见类A是什么东西并不重要,类A并不一定非要是个抽象定义,假如它本身就是一段数据(即在内存中占据一段空间),那么我们就可以在里面搜索了(就像函数一样),因此我们考虑声明struct A后,立即定义struct A classA;将classA看作类A,同时声明struct B classB;将classB看作类B,这样就可以在classB中插入classA的指针,通过这个指针找到classA中的属性。
但这样还是有问题,例如,我希望找到classB.k,但是k在classA中,很明显是无法调用的,你可能需要写个类似classB.pA->k的结构来找到k,但这样写就失去了继承的意义,或者说根本不是继承。由此可见,想用struct模拟出类来基本上是不现实的,我们应该使用其他方法来实现。