分类
公有继承(public)、保护继承(protected)、私有继承(private)是常用的三种继承方式,除了这些继承类型外还有一种虚拟继承。
公有继承(public)
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,即基类的公有成员在派生类中还是公有成员,基类的保护成员在派生类中还是保护成员,而基类的私有成员仍然是私有的,不能被派生类及派生类的子类所访问。
保护继承(protected)
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,也可被派生类的子类访问,基类的私有成员仍然是私有的,不可被派生类及派生类的子类访问。
私有继承(private)
私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,只可以被派生类访问,但是不能被这个派生类的子类所访问。
虚拟继承(virtual)
虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类,虚拟继承与变量的可见性关系不大,在此不做讨论。
访问可见性
各种继承的成员对于派生类和全局函数而言,可见性如下,其中“public继承的派生类中”,指的是以public类型从基类继承出的派生类中对于基类中的各种成员的可访问性,“public继承的派生类的对象”指的是以public类型从基类继承出的派生类的对象在全局函数(例如main函数)中对于基类中成员的可访问性。
可见性 | public | protected | private |
---|---|---|---|
基类中 | public | protected | private |
public继承的派生类中 | public | protected | private |
protected继承的派生类中 | protected | protected | 不可见 |
private继承的派生类中 | private | private | 不可见 |
public继承的派生类的对象 | public | 不可见 | 不可见 |
protected继承的派生类的对象 | 不可见 | 不可见 | 不可见 |
private继承的派生类的对象 | 不可见 | 不可见 | 不可见 |
代码实践出真知
说了这么多你可能都蒙圈了,下面我们写代码来试一试:
class Base //父类(基类)
{
pub
int nPublicData;
protected:
int nProtectedData;
private:
int nPrivateData;
};
//////////////////////////////////////////////////////////////////////////
class B :public Base //基类Base的派生类B(共有继承)
{
public:
void funcDoSomthing()
{
int b;
b = nPublicData; //ok:基类的公共成员在派生类中为公共成员
b = nProtectedData; //ok:基类的保护成员在派生类中为保护成员
b = nPrivateData; //error:基类中私有成员在派生类中是不可见的
}
};
//////////////////////////////////////////////////////////////////////////
class C :protected Base //基类Base的派生类C(保护继承)
{
public:
void funcDoSomthing()
{
int d;
d = nPublicData; //ok:基类的公共成员在派生类中为保护成员
d = nProtectedData; //ok:基类的保护成员在派生类中为保护成员
d = nPrivateData; //error:基类中私有成员在派生类中是不可见的
}
};
//////////////////////////////////////////////////////////////////////////
class D :private Base //基类Base的派生类D(私有继承)
{
public:
void funcDoSomthing()
{
int c;
c = nPublicData; //ok:基类的公共成员在派生类中为私有成员
c = nProtectedData; //ok:基类的保护成员在派生类中为私有成员
c = nPrivateData; //error:基类中私有成员在派生类中是不可见的
}
};
//////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
int a;
B objB;
a = objB.nPublicData; //ok:基类的公共成员在派生类中为公共成员,对对象可见
a = objB.nProtectedData; //error:基类的保护成员在派生类中为保护成员,对对象不可见
a = objB.nPrivateData; //error:基类中私有成员在派生类中是不可见的,对对象不可见
C objC;
a = objC.nPublicData; //error:基类的公共成员在派生类中为保护成员,对对象不可见
a = objC.nProtectedData; //error:基类的保护成员在派生类中为保护成员,对对象不可见
a = objC.nPrivateData; //error:基类中私有成员在派生类中是不可见的,对对象不可见
D objD;
a = objD.nPublicData; //error:基类的公共成员在派生类中为私有成员,对对象不可见
a = objD.nProtectedData; //error:基类的保护成员在派生类中为私有成员,对对象不可见
a = objD.nPrivateData; //error:基类中私有成员在派生类中是不可见的,对对象不可见
return 0;
}
小练习
下面我们来看一个小例子,大家来看看那些变量可以访问
下面我们来看一个小例子,大家来看看那些变量可以访问
class Base
{
public:
int base1;
protected:
int base2;
public:
virtual int funcDoSomething(); //能访问的变量有___________
};
class ProtectedSon : protected Base
{
private:
int sonValue1;
public:
int sonValue2;
public:
int funcDoSomething(); //能访问的变量有___________
};
class PrivateSonSon : private ProtectedSon
{
private:
int sonsonValue1;
protected:
int sonsonValue2;
public:
int funcDoSomething(); //能访问的变量有___________
};
class PublicSonSonSon : private PrivateSonSon
{
private:
int sonsonsonValue1;
public:
int funcDoSomething(); //能访问的变量有___________
};
int _tmain(int argc, _TCHAR* argv[])
{
Base base;
ProtectedSon son;
PrivateSonSon sonson;
PublicSonSonSon sonsonson;
//各个对象能访问的变量有___________
return 0;
}
以上就是一个测试理解的小例子,到底答案是什么,“程序猿们”可以自己试一试……