派生类访问其成员的权限会受到俩个因素的影响:一是在基类中该成员的访问说明符,二是派生类的派生列表中访问说明符
在介绍各种继承方式之前,首先介绍以下不常见的protected说明符,我们可以把protected看作是一个public,private中和后的产物
protected的具体规则如下
(1)和私有成员类似,受保护成员对于类的用户来说是不可访问的(但是可以被类的成员函数或友元访问)
(2)和公有成员类似,受保护成员对于派生类的成员或友元是可访问的(派生类的对象是不可访问的)
(3)派生类只能通过自己的成员函数调用自己的对象来访问它的protected而不能通过自己的成员函数通过调用基类的对象来访问它
1.公有继承
派生类的派生列表为public它的具体特性如下
(1)派生类对象只能直接访问从基类继承过来的public成员
(2)派生类的成员函数可以直接访问从基类继承过来的public和protected成员
(3)派生类从基类基类继承过来的成员函数可以直接访问从积累继承过来的private成员
具体实例如下
#include<iostream>
using namespace std;
class Base
{
public:
int a1;
Base(int i,int j,int k):a1(i),a2(j),a3(k)
{
}
void print1(void)
{
//继承类继承自基类的函数可以访问a2也可以访问a3
cout<<"base a2:"<<a2<<endl;
cout<<"base a3:"<<a3<<endl;
}
protected:
int a2;
private:
int a3;
};
class Derived:public Base
{
public:
Derived(int i,int j,int k):Base(i,j,k)
{
}
void print2(void)
{
//继承类自身的成员函数可以访问a2
cout<<"derived a2:"<<a2<<endl;
//继承类自身的成员函数不可以访问a3
//cout<<"derived a3:"<<a3;
}
};
int main(void)
{
Base test1(0,0,0);
Derived test2(1,2,3);
//继承类对象可以直接访问a1
cout<<"继承类对象 a1:"<<test2.a1<<endl;
//继承类对象不能直接访问a2和a3
//cout<<" a2:"<<test2.a2<<endl;
//cout<<"a3:"<<test2.a3<<endl;
test2.print1();
test2.print2();
//继承类和积累的大小相同
cout<<"a:"<<sizeof(test1)<<endl;
cout<<"b:"<<sizeof(test2)<<endl;
return 0;
}
公有继承将会是我们今后最长遇到的
2.私有继承
私有继承基本和公有继承差不多,唯一的差异就是,public继承继承自基类的public部分在继承类中依然是公有的,而private则变为私有的了
具体实例如下
#include<iostream>
using namespace std;
class Base
{
public:
int a1;
Base(int i,int j,int k):a1(i),a2(j),a3(k)
{
}
void print1(void)
{
//继承类继承自基类的函数可以访问a1,a2,a3
cout<<"base a1:"<<a1<<endl;
cout<<"base a2:"<<a2<<endl;
cout<<"base a3:"<<a3<<endl;
}
protected:
int a2;
private:
int a3;
};
class Derived:private Base
{
public:
Derived(int i,int j,int k):Base(i,j,k)
{
}
void print2(void)
{
print1();
//继承类自身的成员函数可以访问a1,a2
cout<<"derived a1:"<<a1<<endl;
cout<<"derived a2:"<<a2<<endl;
//继承类自身的成员函数不可以访问a3
//cout<<"derived a3:"<<a3;
}
};
int main(void)
{
Base test1(0,0,0);
Derived test2(1,2,3);
//继承类对象不可以直接访问a1,a2,a3
cout<<"a1:"<<test2.a1<<endl;
cout<<"a2:"<<test2.a2<<endl;
cout<<"a3:"<<test2.a3<<endl;
test2.print2();
//继承类和积累的大小相同
cout<<"a:"<<sizeof(test1)<<endl;
cout<<"b:"<<sizeof(test2)<<endl;
return 0;
}
3.保护继承
保护继承与public继承也基本相似,唯一的区别就是。protected继承自基类中public,protected的成员在继承类中都是protected的。此处就不给读者例子了,留给读者自己去模仿前俩个例子探索把^_^