//保护型数据在派生类中遇到的小问题
//自析自解
#include<iostream.h>
#include<math.h>
class A
{
protected:
double a,b;
public:
A();
A(A&);
~A();
void show();//显示一个点
double get_a();//取a的值
double get_b();//取b的值
void set_A();//设置a,b的值
};
//********构造函数*****************************************
A::A()
{
a=0; b=0;
}
//**********拷贝构造函数**********************************
A::A(A&aa)
{
a=aa.a; b=aa.b;
}
//*********析构函数***************************************
A::~A()
{
cout<<"析构对象"<<endl;
}
//**********show(显示一个点)函数**********************************
void A::show()
{
cout<<"( "<<a<<","<<b<<" )"<<endl;
}
//***********get_a(取a的值)函数**********************************
double A::get_a()
{
return a;
}
//**********get_b(取b的值)函数**********************************
double A::get_b()
{
return b;
}
//*********set_A(设置a,b的值)函数**********************************
void A::set_A()
{
cout<<"请输入a和b的值:"<<endl;
cin>>a>>b;
cout<<"/na="<<a<<" b="<<b<<endl;
}
//**********************************************
class B:public A
{
double a1,b1;//代表方程为y+ax+b=0的系数
public:
B();
B(B&);
~B();
void set_B();//设置一条直线方程
void count(A&aa);//计算点与线的距离
};
//********B构造函数*****************************
B::B():A()
{
a1=0;
b1=0;
}
//*********拷贝构造函数************************
B::B(B&aa)
{
a=aa.a;b=aa.b,a1=aa.a1,b1=aa.b1;
}
//*******析购函数*******************************
B::~B()
{
cout<<"析构派生类对象"<<endl;
}
//**********设置一条直线方程************************
void B::set_B()
{
cout<<"输入直线的系数a1和b1(y+a1x+b1=0)"<<endl;
cin>>a1>>b1;
cout<<"/na1="<<a1<<" b1="<<b1<<endl;
}
//**********计算点与线的距离函数********************
void B::count(A&aa)
{
double dis;
dis=fabs(aa.get_b()+a1*aa.get_a()+b1)/sqrt(a1*a1+1);
cout<<"点与直线的距离为:"<<dis<<endl;
}
int main()
{
//测试类A***********
A aa,ee;
aa.show();
aa.set_A();
A bb(aa);
bb.show();
//测试类B****************
B aa1;
aa1.count(aa);
aa1.set_B();
aa1.show();
B bb1;
bb1.count(aa);
bb1.show();
return 0;
}
运行结果没问题:
若把dis=fabs(aa.get_b()+a1*aa.get_a()+b1)/sqrt(a1*a1+1);
改成:
dis=fabs(aa.b+a1*aa.a+b1)/sqrt(a1*a1+1);
则出现错误:'b' : cannot access protected member declared in class 'A'
'a' : cannot access protected member declared in class 'A'
但看一下构造函数:
B::B(B&aa)
{
a=aa.a;b=aa.b,a1=aa.a1,b1=aa.b1;
}
却不出现问题.
分析:
因为B的拷贝构造函数传递的是类B的引用,而void B::count(A&aa)中传递的是A类型对象的引用. 因为类A中把数据定义为保护型,所以跟传递的性质有很大的关系.
体会:
虽然保护型数据能在派生类的对象中直接引用,但也得注意使用的方法.因为有时传过来的并不是派生类对象,而是基类对象.
|