/保护型数据在派生类中遇到的小问题

 
//保护型数据在派生类中遇到的小问题
//自析自解
#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中把数据定义为保护型,所以跟传递的性质有很大的关系.
 
体会:
虽然保护型数据能在派生类的对象中直接引用,但也得注意使用的方法.因为有时传过来的并不是派生类对象,而是基类对象.
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值