`
jgsj
  • 浏览: 964650 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
//保护型数据在派生类中遇到的小问题
//自析自解
#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();
Abb(aa);
bb.show();
//测试类B****************
B aa1;
aa1.count(aa);
aa1.set_B();
aa1.show();
Bbb1;
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中把数据定义为保护型,所以跟传递的性质有很大的关系.
体会:
虽然保护型数据能在派生类的对象中直接引用,但也得注意使用的方法.因为有时传过来的并不是派生类对象,而是基类对象.
分享到:
评论

相关推荐

    java 面试题 总结

    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的...

    JAVA面试题最全集

    给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46.访问修饰符“public/private/protected/缺省的修饰符”的使用 47.用关键字final修饰一个类或者方法时,有何意义? 48.掌握类和...

    超级有影响力霸气的Java面试题大全文档

     异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    本书是第I卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用PHP进行Web开发的各个方面的知识和技巧,主要包括开发环境、PHP基础、Web页面交互、文件操作、会话应用、图形图像处理及面向...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    本书是第I卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用PHP进行Web开发的各个方面的知识和技巧,主要包括开发环境、PHP基础、Web页面交互、文件操作、会话应用、图形图像处理及面向...

Global site tag (gtag.js) - Google Analytics