Masimaro's blog - 类成员访问
type: channel
link: https://www.masimaro.top/tag/%E7%B1%BB%E6%88%90%E5%91%98%E8%AE%BF%E9%97%AE/
items: C++继承

C++继承
type: item
date: 2015-08-21T10:54:00+08:00
description: ​在封装的过程中，我们发现有很多地方有问题，比如我们在封装Windows API 的过程中，每个窗口都有各自的消息处理，而我们封装时不同的窗口要针对不同的消息而编写不同的消息处理函数，不可能所有窗口对于某些消息都进行相同的处理，所以在面向对象的程序设计中，提供了一种新的方式——继承与派生；在c++中将继承的一方称作派生类或者子类，将被继承的一方叫做基类或者父类继承的基本格式如下(CB 继承CA)：class CA { public: CA(); ~CA(); } class CB : public CA { public: CB(); ~CB(); }派生类中前面相应大小空间的内存保存的是基类的内容，而后面的部分保存的是派生类的内容，这样派生类就可以拥有基类的所有成员，而不必重写代码达到了代码重用的目的。在设计中一般将类的共性提取出来作为基类，而将不同的部分从基类派生，作为每个类的特性，对于共性的内容我们只需要在基类中编写，而在派生类中直接使用。下面我们来探讨一下，基类与派生类中构造与析构的调用关系，通过写下面一个简单的小例子：class CA { public: CA(){ cout <<"CA()"<<endl; } ~CA(){ cout <<"~CA()" << endl; } }; class CB : public CA { public: CB(){ cout <<"CB()" << endl; } ~CB(){ cout <<"~CB()" << endl; } }; int _tmain(int argc, _TCHAR* argv[]) { CB objB; return 0; }最终的结果是先调用基类的构造函数在调用派生类的构造函数，而对于析构的调用顺序正好相反，先调用派生类在调用基类：对于继承来说有三种：共有继承、私有继承以及保护继承，继承的方式不同，派生类对于基类的各种不同属性之间成员的访问权限不同，下面再给出一个表格用以说明这个问题：通过这个表我们可以总结出一下几点：1）私有成员在任何情况下都不能被派生类访问；2）公有继承下其他基类成员在派生类中的访问属性不变；3）私有继承下其他基类成员在派生类中全部变为私有；4）保护继承下其他类成员在派生类中全部变为保护属性；从这个表中我们可以看出，私有继承与保护继承对于基类的访问属性完全相同，那么它们有何区别呢？保护成员的访问情况与私有相同，即类的保护成员在类内可以访问在类外不能访问，它们二者的区别在这个表中确实没有体现出来，主要的区别可以在下一层的继承中体现比如有三个类继承关系为CC->CB->CA，继承类型分别为，我们知道基类的非私有成员在保护继承下公有的变为保护，保护的仍然为保护，而私有继承则是将所有都变为私有，他们之间如果都是保护继承的方式，那么CA中的其他成员在CB中都变为保护类型那么在CC中仍然能够访问到CA的成员；当他们之间都是以私有继承的方式，那么CA中的成员在CB中都为私有，在CC中就不能访问CA中的成员，所以在一般情况下，我们将基类的数据成员声明为保护类型，这样既起到了封装的作用，又方便派生类的访问；​