public继承:所继承的成员的访问权限不变,公有即公有、保护即保护、私有即私有(只有继承来的成员函数才能访问继承来的私有
protected继承:继承来的public成员在该派生类中就是protected成员,同样继承来的protected在派生类中保持原来的访问级别
private继承: 继承来的public 和protected成员在该派生类中的权限变成了private,已经不能随意访问。
刚开始时,我对继承有误解,以为只是继承一部分,但其实继承的是所有基类的成员,只不过
是访问级别不一样而以。我们可以看看下面的代码:
#include<iostream>
using namespace std;
class A
{
public:
int a;
private:
int b;
protected:
int c;
};
class B :public A
{
};
void main()
{
cout << sizeof(B) << endl;
system("pause");
}
输出结果12,这样我就理解了这个内容
1.protected关键字
关于protected继承,我们有一条规则很重要:
派生类的成员或友元函数只能通过派生类的对象来访问基类的受保护成员。派生类对于一个基类对象中
的受保护成员没有任何访问特权。
我们可以看下面的代码
#include<iostream>
using namespace std;
class A
{
protected:
int a;
};
class B :public A
{
friend void pr(B&);
friend void pr(A&);
int b;
};
void pr(B&c)
{
c.b = c.a;//可以访问
}
void pr(A&c)
{
c.a = 0;//报错,不可以访问
}
void main()
{
system("pause");
}
我们可以这样理解,第二个pr函数不是A类的友元,但它依旧修改了protected的成员。
2.公有,私有,和受保护继承
某个类对其继承来的成员的访问权限受到两个因素影响:一是在基类中该成员的访问说明符,二是在派生类中的
访问说明符.
看下面的代码:
#include<iostream>
using namespace std;
class A
{
protected:
int a;
public:
int b;
private:
int c
};
class B :public A//共有继承,意思是原来基类的访问权限都没变
{
int get_a()
{
return a;
}
int get_b()
{
return b;
}
int get_c()
{
return c;//错误,private成员对于派生类是不可访问的
}
};
void main()
{
system("pause");
}
继续
#include<iostream>
using namespace std;
class A
{
protected:
int a;
public:
int b;
private:
int c;
};
class B :private A//私有继承,public的成员变成private,无法被用户访问
{
int get_a()
{
return a;
}
int get_b()
{
return b;
}
int get_c()
{
return c;//错误,private成员对于派生类是不可访问的
}
};
void main()
{
B e;
system("pause");
}
至于保护继承其实与上面一样,继承的访问说明符决定继承来的成员在类中的访问权限,
而基类中的访问权限决定派生类是否能访问。
3.派生类向基类转化的可访问性
主要是动态绑定的内容
看下面的代码:
#include<iostream>
using namespace std;
class A
{
protected:
int a;
public:
static const int b=20;
virtual int get_b();
private:
int c;
};
int A::get_b()
{
return b;
}
class B :public A
{
int get_a()
{
return a;
}
public:
static const int b= 30;
int get_b();
};
int B::get_b()
{
return b;
}
int get(A&e)
{
return e.get_b();
}
void main()
{
B e;
cout << get(e);//动态绑定
system("pause");
}
你可以试着改变一下继承的方式,可以改为private,这样的话派生类向基类转换的可
访问性就被隐蔽了。总之就是:对于代码中的某个给定节点来说,如果基类的公有成员
时可访问的,则派生类向基类的类型转换也是可访问的。
如果发现错误我会及时回来改正。