C++中继承分为三种方式:公有继承(public)、私有继承(private)、保护继承(protected)。
可以按照两个标准来区分这三种继承方式:
(1)派生类(函数)是否可以访问基类的成员? 派生类(函数)是否可以访问基类的函数?
(2)派生类的对象是否可以访问基类的成员? 是否可以访问基类的函数?
一般来说类对象对于自己的private及protected成员和函数是不能访问的。
下面来具体说一下各个继承方式的特点:
(1)public
派生类函数可以访问基类中的public和protected成员,不能访问private成员(不可见),可以借助基类的成员函数访问基类private成员。
派生类的对象仅可以访问基类中的公有成员。
(2)protected
派生类函数可以访问基类中的public和protected成员,不能访问private成员(不可见),可以借助基类的成员函数访问基类private成员。实际上基类的public和protected成员都成为派生类的protected成员,只能通过派生类的成员函数或者是友元访问。
派生类的对象不可以访问基类中的所有成员,也不能访问基类的成员函数。
(3)private
派生类函数可以访问基类中的public和protected成员,不能访问private成员(不可见),可以借助基类的成员函数访问基类private成员。实际上基类的public和protected成员都成为派生类的private成员,只能通过派生类的成员函数或者是友元访问。
派生类对象既不能访问基类的成员变量也不能访问基类的成员函数。
在无继承的类中,protected和private控制符是没有差别的。在继承中,基类的private对所有的外界都屏蔽(包括自己的派生类)。
下面是类继承示例(转):
#include<iostream>
using
namespace
std;
//
class
A
//父类
{
private
:
int
privatedateA;
protected
:
int
protecteddateA;
public
:
int
publicdateA;
};
//
class
B :
public
A
//基类A的派生类B(共有继承)
{
public
:
void
funct()
{
int
b;
b=privatedateA;
//error:基类中私有成员在派生类中是不可见的
b=protecteddateA;
//ok:基类的保护成员在派生类中为保护成员
b=publicdateA;
//ok:基类的公共成员在派生类中为公共成员
}
};
//
class
C :
private
A
//基类A的派生类C(私有继承)
{
public
:
void
funct()
{
int
c;
c=privatedateA;
//error:基类中私有成员在派生类中是不可见的
c=protecteddateA;
//ok:基类的保护成员在派生类中为私有成员
c=publicdateA;
//ok:基类的公共成员在派生类中为私有成员
}
};
//
class
D :
protected
A
//基类A的派生类D(保护继承)
{
public
:
void
funct()
{
int
d;
d=privatedateA;
//error:基类中私有成员在派生类中是不可见的
d=protecteddateA;
//ok:基类的保护成员在派生类中为保护成员
d=publicdateA;
//ok:基类的公共成员在派生类中为保护成员
}
};
//
int
main()
{
int
a;
B objB;
a=objB.privatedateA;
//error:基类中私有成员在派生类中是不可见的,对对象不可见
a=objB.protecteddateA;
//error:基类的保护成员在派生类中为保护成员,对对象不可见
a=objB.publicdateA;
//ok:基类的公共成员在派生类中为公共成员,对对象可见
C objC;
a=objC.privatedateA;
//error:基类中私有成员在派生类中是不可见的,对对象不可见
a=objC.protecteddateA;
//error:基类的保护成员在派生类中为私有成员,对对象不可见
a=objC.publicdateA;
//error:基类的公共成员在派生类中为私有成员,对对象不可见
D objD;
a=objD.privatedateA;
//error:基类中私有成员在派生类中是不可见的,对对象不可见
a=objD.protecteddateA;
//error:基类的保护成员在派生类中为保护成员,对对象不可见
a=objD.publicdateA;
//error:基类的公共成员在派生类中为保护成员,对对象不可见
return
0;
}