hello!各位亲爱的大爷和大妈们,我上线了,从你们激动的眼神之中我看的出你们对我的爱,果然我很受欢迎。
d
废话不多说,开学。之前讲解private继承,不知道的快去查查,那么那个一直在我们眼前晃的protected到底是啥,这玩意叫保护继承。它把基类的其他两个成员进行保护,如果那个派生类的二愣子来调用public和private,那么protected就让这俩货直接在派生类内被屏蔽。哎,不让你用,难不难受。
啥叫访问声明,c++提供的一种访问调节机制(废话),简单来说,就是可以访问派生类之中不可见的那些东东。上图说明。
1 clss B:point A
{
public:
A::get_xy();
int get_s()
{return s;}
void make_s()
{s=x*y;}
private:
int s;};
2 int main()
{ B objB;
cout<<"it is b";
objB.get_xy();
objB.make_s();
cout<<"s="<<objB.make_s()<<endl;}
大伙好好看一下代码一,和之前相比(在上个文章),这里不再需要我们的老弟make_s()来替换get_xy()了,我们的代码变的简单了。可以和以前一样肆无忌惮了,那么访问声类名的格式嘞,是这样的 基类名::成员。是不是很简单,是不是觉得,就这?
注意事项来咯:
1 进行访问声明时候被访问的基类不可以说明是什么类型,当被声明的对象是成员函数的时候,只能是函数名本身,不可以夹带其他的东东。图来。
class A
{
publid:
int m;
int n;
>>>>
};
class B:public A
{
int d;
public:
A::m;//正确
A::int n;//错误,带可int
}
};
你说你傻不傻,可以少写一个就是一个,还积极的写。所以以后用声明类的时候别多写了啊。
2 这第二个就更加简单了。就声明指针他不能提高一个派生类之中基类成员的可访问性,也不能去降低。原来在基类中是什么地位,在派生类中就什么地位。举例子来说,你不能把一个在基类之中是public的一个成员,在派生类之中放到private之中,这不是降低了他的可访问性嘛,简直断“基”财路,不共戴天。如果还不懂,上图
class A
{
publid:
int m;
int n;
private:
int s;
};
class B:public A
{
int d;
public:
A::s;//错误,提高了基类中成员s和可访问性
A:: n;//正确
}
};
3 最后一个要注意的要点来了。
(一)对重载函数名的访问声明将调整基类所有的同名函数的访问域
这啥意思,怎么理解。字面意思,意思意思一下就可以了。
1 调整同名函数的重载
class A:
{
public:
if();
if(int);
}
class B:public A
{
public:
A::if;//使if和if(int)都被调用,在classB之中转化为公有
}
2 不同访问域的重载函数名不能用于访问声明
class A:
{
public:
if();
private:
if(int);
}
class B:public A
{
public:
A::if;//错误,访问具备二义性,不能调整其访问性
}
3 派生类和基类名字相同的不可调整访问权限
class A:
{
public:
if();
}
class B:public A
{
public:
if(int)
A::if;//错误,f 有两次说明,不能调整其访问权限
}
接下来,就是重名成员了
来吧,熬夜继续上~。
重名成员可以直接字面理解,名字重了呗。C++允许派生类和基类有重名的现象,如果要在派生类中使用基类的重名成员,可以显示的使用作用域符指定。格式如下:类名::成员。
1 重名数据成员:
如果在派生类之中有和基类重名的数据成员,程序会直接大方的给那两个重名的成员每个人开辟一个空间。(怕你不懂,只好来代码了,哎,这操心的娃)
#include<iostream>
using namespace std;
class B
{
public:
int a,b;
};
class C:public::B
{
public:
int b,c;//注意c重名了
};
int main()
{b
C d;
d.a=1;
d.B::b=3;//这里用的是B中的b
d.b=4;//这里是C的b
cout<<"d.a="<<d.a<<"d.B::b="<<d.B::b<<"d.b"<<d.b<<endl;
}
2 重名成员函数
(别搞混成员函数和数据函数)
他通过形式指示this指针的不同类型,调用不同版本的成员函数。啥?没搞懂?
上图
#include<iostream>
using namespace std;
class A
{
public:
int a1,a2;
A(int i1=0,int i2=0)
{
a1=i1;
a2=i2;
}
void print()
{cout<<a1<<" "<<a2<<endl;}
};
class B:public::A
{
public:
int b1,b2;
B(int e1=4,int e2=6)
{
b1=e1;
b2=e2;
}
void print()//睁大眼睛了,这里的void print()是不是重复了
{cout<<b1<<" "<<b2<<endl;}
};
int main()
{
B b;
b.A::print();//这里他是使用了A基类的print()
b.print();//这里是调用了自身的print()
}
程序定义了两个print(),如果不指定类域调用print,那么会屏蔽基类A的print,到时候输出的只有B的print。咋不复杂了,就这样简简单单的了。
来说一个要点 基类成员在派生类之中都具备作用域但是他不具备派生类中所定义的成员的作用域。若派生类和基类重名,尽管基类的同名成员在派生类中被屏蔽,旦他不能被覆盖和取代,作用域依然有用,可以通过域运算符找到它。(下面有请基类成员发言,“咳咳,你可以打败我,旦不能杀死我,不能取代我,我的人民知道如何找到我,基类不败”)
派生类中d访问基类成员
如果基类之中定义了静态成员。这些静态成员将在整个类系统之中被共享,根据它自身的访问特性和派生类的继承方式,在类层次系统中具有不同的访问性质。
就这样吧,累了,妹妹。下次说基类的初始化。