C++语言中,通过继承的机制,可以利用已有的类型来定义新的类型。所定义的新类型拥有原来类型的属性,同时还具有新的属性。我们称已存在的用来生成新的类型的类称为基类。而由已存在的类派生出来的新类为派生类。派生类继承了基类,派生类中拥有基类中所有成员,并且派生类本身还拥有它自己的新成员。派生类可以只从一个基类中派生,也可以聪哥多个基类中派生。
在使用class定义派生类时,默认的继承方式是私有继承。
继承的三种方式:
1,公有继承方式(public)
特点是基类中的非私有成员在派生类中保持同样的访问权限,即基类中的public成员在派生类中仍为public成员,基类中的protected成员在派生类中仍为protected成员。
2,私有继承方式(private)
特点是基类中的非私有成员,不论是public成员,还是protected成员,在派生类中都是private成员,而且它们都不能再被派生类的子类所访问。
3,保护继承方式(protected)
特点是基类中的public成员和protected成员在派生类中都是protected成员。
不同的继承方式规定了基类中不同访问权限的成员在派生类中有不同的访问权限,在三种继承方式中,基类的私有成员派生类都不可以访问。
对于不同的继承方式,基类中的各种不同访问权限的成员在派生类中的访问权限如下表:
基类成员\继承方式 | public | private | protected |
public | public | private | protected |
private | 不可访问 | 不可访问 | 不可访问 |
protected | protected | private | protected |
就来用一个程序题来说明这些访问权限:
<span style="font-size:18px;">#include <iostream>
using namespace std;
class Base
{
public:
int a1;
protected:
int a2;
private:
int a3;
};
class D1:public Base//公有继承基类Base
{
public:
void test()
{
a1=10;//可以,a1为public
a2=20;//可以,a2为protected
a3=30;//不可以
}
};
class D11:public D1//公有继承基类D1
{
public:
void test()
{
a1=5;//可以,a1为protected
a2=6;//可以,a2为protected
a3=7;//不可以访问
}
};
class D2:private Base//私有继承基类Base
{
public:
void test()
{
a1=8;//可以,b1为private
a2=9;//可以,b2为private
a3=10;//不可以访问
}
};
class D22:public D2//公有继承基类D2
{
public:
void test()
{
a1=11;//不可以访问
a2=12;//不可以访问
a3=13;//不可以访问
}
};
class D3:protected Base//保护继承基类Base
{
public:
void test()
{
a1=15;//可以,a1为protected
a2=16;//可以,a2为protected
a3=17;//不可以访问
}
};
class D33:public D3//公有继承基类D3
{
public:
void test()
{
a1=18;//可以,a1为protected
a2=19;//可以,a2为protected
a3=20;//不可以访问
}
};
int main()
{
D11 d1;
d1.a1=1;//合法
d1.b2=2;//非法
d1.a3=3;//非法
D22 d2;
d2.a1=4;//非法
d2.a2=5;//非法
d3.a3=6;//非法
D33 d3;
d3.a1=7;//非法
d3.a2=8;//非法
d3.a3=9;//非法
return 0;
}</span>
对于派生类的对象对其基类的成员访问性归结为:
1,对于公有继承方式来说,只有基类的公有成员可被派生类对象访问,其他成员不可。
2,对于私有继承方式和保护继承方式来说,基类中所有成员都不能被派生类的对象访问。