(1) 公有派生
(2) 私有派生
(3) 保护派生
这两种派生方式的特点如下 :
【1】、 无论哪种派生方式 , 基类中的私有成员既不允许外部函数访问 , 也不允许派生类
中的成员函数访问 , 但是可以通过基类提供的公有成员函数访问。
【2】、 公有派生与私有派生的不同点在于基类中的公有成员在派生类中的访问属性。
·公有派生时 , 基类中的所有公有成员在派生类中也都是公有的。
·私有派生时 , 基类中的所有公有成员只能成为派生类中的私有成员。
下面我们分别讨论私有派生和公有派生的一些特性。
总结:在公有派生情况下 , 基类中所有成员的访问特性在派生类中维持不变 ; 在私有派生情况下 , 基类中所有成员在派生类中成为私有成员
1 . 私有派生
【1】私有派生类对基类成员的访问
由私有派生得到的派生类 , 对它的基类的公有成员只能是私有继承。也就是说基类的所有公有成员都只能成为私有派生类的私有成员 ,这些私有成员能够被派生类的成员函数访问,但是基类私有成员不能被派生类成员函数访问。
【2】外部函数对私有派生类继承来的成员的访问的私有派生时 , 基类的公有成员在派生类中都成为私有成员 , 外部函数不能访问。
2、公有派生
在公有派生中 , 基类中的私有成员不允许外部函数和派生类中的成员函数直接访问 ,但是可以通过基类提供的公有成员函数访问。 基类中的公有成员在派生类中仍是公有成员 , 外部函数和派生类中的成员函数可直接访问。
保护成员的作用
在前面讲过 , 无论私有派生还是公有派生 , 派生类无权访问它的基类的私有成员 ,派
生类要想使用基类的私有成员 , 只能通过调用基类的成员函数的方式实现 , 也就是使用基
类所提供的接口来实现。 这种方式对于要频繁访问基类私有成员的派生类而言 , 使用起
来非常不便 , 每次访问都需要进行函 数调用。实际上 , 为了让派生类访问基类的私有成
员, C + + 还提供了具有另一种访问属性的成员— — —protected 成员 , 这种成员称为保护成员。
保护成员可以被派生类的成员函数访问 , 但是对于外界是隐藏起来的(这点类似私有成员) , 外部函数不能
访问它。 因此 , 为了便于派生类的访问 , 可以将基类私有成员中需要提供给派生类访问的成员定义为保护成员。
#include <iostream>
using namespace std;
class base
{
protected://保护成员
int a, b;
public://公有成员
void setab(int n, int m)
{
a = n;
b = m;
}
};
class derive : public base
{
private:
int c;
public:
void setc(int n)
{
c = n;
}
void showabc()
{
cout<< a<< b<< c <<endl;// 允许派生类成员函数 访问保护成员 a 和 b
}
};
main ( )
{
derive obj;
//obj.a=3 //非法,保护成员不能通过派生类的外部函数访问
obj .setab( 2, 4) ;
obj .setc( 3) ;
obj .showabc( ) ;
return 0 ;
}
结果: