类的继承,是新的类从已有类那里得到已有的特性,而已有类称为基类,新类称为派生类。类的继承方式分为public (公有继承)、protected(保护继承)、private(私有继承)三种。不同的继承方式,导致原来具有不同访问属性的基类成员在派生类中的访问属性也有所不同。
公有继承(public):当类的继承方式为公有继承时,基类的公有成员和保护成员在派生类中不变,基类的私有成员不能直接被派生类访问。
保护继承(protected):当类的继承方式为保护继承时,基类的公有成员和保护成员将成为派生类的保护成员。
私有继承(private):当类的继承方式为私有继承时,基类的公有成员和保护成员将成为派生类的私有成员。
访问属性\基类成员 | public | protected | private |
---|---|---|---|
同一个类 | yes | yes | yes |
派生类中新增成员 | yes | yes | no |
派生类外部(非类族内成员) | yes | no | no |
总结:
1、无论什么继承,基类的私有成员都不可直接访问。
2、无论什么继承,基类的公有接口都将成为派生类的内部接口。
3、当类的继承方式为XX继承时,基类的公有成员和XX成员将成为派生类的XX成员,但是公有继承中基类的公有和保护成员访问属性在派生类中不变。
4、类外部只能访问到派生类和从基类继承下来的公有成员,想访问保护和私有成员还是算了吧。
5、最后也是最重要的一点,我们几乎不使用protected、private继承,一般只用public继承,不想搞得太深的小伙伴们只需记住public继承就可以了。
随便写点代码让大家印象深刻一些:
#include <iostream>
using namespace std;
class A
{
public:
void a();
int a_1;
protected:
int a_2;
private:
int a_3;
};
class B :public A
{
public:
void b1(){cout<<"a_1="<<++a_1<<endl;}
void b2(){cout<<"a_2="<<++a_2<<endl;}
};
int main()
{
B b;
b.b1();
b.b2();
return 0;
}
很容易看出a_1
和a_2
都已经+1,因为这是公有继承,基类的public和protected变成了派生类的public和protected。
继承之后的B类其实是这样的:
class B :public A
{
public:
void a();
void b1(){cout<<"a_1="<<++a_1<<endl;}
void b2(){cout<<"a_2="<<++a_2<<endl;}
int a_1;
protected:
int a_2;
};