代码改变世界

C实现类、继承、多态

2016-09-24 10:35  shuaihanhungry  阅读(578)  评论(0编辑  收藏  举报

首先考虑用C实现类

  • 肯定是要使用struct的,类的数据成员放在struct里面;
  • 而类有构造函数、析构函数,这两个函数必须在struct外面,构造函数要分配struct空间并初始化struct成员,且返回一个指向struct的指针,析构函数要释放这些动态分配的空间;
  • 成员函数如何实现呢?想想我们在C++访问成员函数是通过对象、指针、引用的,那么成员函数就最好在struct里面而不是像构造析构函数在struct外面,struct里面如何实现成员函数呢?可以使用函数指针,要构造函数中初始数据成员的同时也初始化这些函数指针,即初始化成员函数,同理析构函数也需要这样一个指针参数;
  • 那么成员函数如何调用呢?C++中成员函数需要通过this指针访问数据成员,this指针是编译器添加的,这里我们调用函数指针对应的成员函数时传递一个指向struct的指针,通过这个指针我们就可以访问数据成员。

再考虑用C实现继承

  • 继承可以通过在派生类对象中维护一个基类对象的指针来完成。

再考虑用C实现多态

  • 在C++中,多态是通过在对象中安插一个指针指向该类的虚函数表,虚函数表的slot放着指向虚函数的指针,我们调用虚函数时使用对象中的指针和slot的索引即可;
  • 在C中,为了实现多态,基类对象应该能够访问派生类对象,像实现继承一样,同样可以在基类对象是维护一个派生类对象的指针,那么这个指针的类型如何确定呢,可以使用void *类型,需要使用时强制转换即可;
  • 我们在派生类的构造函数中初始化时,先调用基类的构造函数,再完成派生类数据成员的初始化,最后完成虚函数表的初始化,构造函数返回指向基类对象的指针;
  • 虚函数表如何初始化呢?我们使用指向基类对象的指针来对基类中的虚函数进行初始化;
  • 为实现多态,派生类的析构函数、成员函数需要使用指向基类对象的指针,即调用这些函数时传递一个指向基类对象的指针,这个指针也是构造函数返回的指针。

参考:C中的继承和多态