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

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

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

相关推荐

    C&C++面试笔试题透析(笔试和面试中遇到)

    而函数覆盖出现在派生类中,当派生类重新定义基类的虚函数时,基类函数被覆盖,运行时根据对象的实际类型调用相应的函数。 线程同步的三种常见方式包括: 1. 互斥量(Mutex):保证同一时间只有一个线程能访问特定...

    《面向对象程序设计C++》期末试卷及答案.docx

    10. **继承与访问控制**:在继承中,public成员在派生类中保持public,private成员保持private,protected成员保持protected。选项D错误,因为私有继承时,基类的public成员变为派生类的private成员。 11. **常成员...

    C++错误代码中文解释

    这是C++访问控制规则的体现,基类的私有或受保护成员在派生类中是不可见的。 - E0658:“实验性的语言特性未启用”。VS2008可能不支持某些后来引入的C++标准特性,如右值引用或lambda表达式。 通过"C++错误代码...

    c++技术术语.doc

    - **应用场景**:比如在类继承关系中,派生类与基类之间的关系就可以被称为“相关”。 ### Associative Container 关联式容器(对应Sequential Container) - **定义**:关联式容器是基于键值对存储数据的容器,如...

    c++期末考试习题.pdf

    7. 在保护继承中,基类的公共成员在派生类中的访问属性变为保护的,意味着只能被派生类及其子类访问。 8. 访问对象的成员可以使用`.`操作符,例如`p.b`表示通过指针`p`访问其指向的对象的成员`b`。 9. 友元函数是...

    计算机类面试试题大奉献

    方法重写(Override)发生在派生类中,用于覆盖基类中的虚方法,以提供新的实现。这使得子类能够根据自己的需求定制父类的行为。方法重载(Overload)则是在同一个类中定义多个同名方法,但它们的参数列表不同,...

    2021-2022计算机二级等级考试试题及答案No.16271.docx

    在面向对象编程中,特别是C++语言中,当一个类公有派生自另一个类时,默认情况下它可以访问基类的公有成员和保护成员。然而,如果一个成员被声明为私有的,那么即使是公有派生类也无法直接访问它。因此,选项A“私有...

    面向对象程序设计c++

    4. 继承(Inheritance):继承允许一个类(子类或派生类)从另一个类(基类或父类)继承属性和行为。这有助于减少代码重复,提高代码重用,并且使结构更加层次化。比如,我们可以创建一个“豪华汽车”类,它继承自...

    C#学习(基础知识,OOP概念,继承等)

    1. 基类与派生类:基类(父类)提供了派生类(子类)可以继承的属性和方法。派生类可以添加新的特性,也可以覆盖或扩展基类的行为。 2. sealed关键字:用于防止类被继承,确保基类的完整性和安全性。 3. override...

    java 面试题 总结

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

    《面向对象程序设计C++》期末试卷及标准答案(A).pdf

    12. 继承与访问控制:在派生类中,基类的访问控制保持不变,B 选项描述错误,因为基类的 private 成员在派生类中仍然是 private 的。 13. 虚基类:虚基类的目的是消除多继承时的二义性,确保只有一个基类实例。 14...

    2021-2022计算机二级等级考试试题及答案No.11111.docx

    - **protected**: 受保护成员,可以在本类和其派生类中被访问。 - **private**: 私有成员,只能在定义它的类内部被访问。 - **default**: 默认访问级别(通常不显式声明),在Java中意味着非私有、非公有、非受保护...

    MFC 多线程.7z

    在MFC中,线程由CWinThread类抽象表示,它是CObject的派生类。CWinThread类提供了创建、管理和同步线程的基本方法。创建线程时,通常需要继承CWinThread并重写它的成员函数,比如Run(),这个函数将执行新线程的主要...

    C#快速入门的简明教程

    C#是一种广泛应用于游戏开发、桌面应用、移动应用和Web应用的高级...在学习过程中,不断动手实践,编写代码,遇到问题勇于探索,将理论知识转化为实际技能,才能真正实现“举一反三”。祝你在C#的学习旅程中取得成功!

    大学复习资料-c++面对对象程序设计.zip

    2. 继承:继承允许一个类(子类或派生类)从另一个类(基类或父类)继承属性和行为。这样可以实现代码重用,减少重复编写,并且使类层次结构更清晰。C++支持单继承和多继承,但多继承可能导致菱形问题,这时可以使用...

    面向对象程序设计课件

    在C++中,我们通过访问修饰符(如`public`、`private`、`protected`)来控制成员的可见性,实现数据的安全和保护。 3. **继承**: 继承允许我们创建一个新的类(子类或派生类),它是现有类(父类或基类)的一个...

Global site tag (gtag.js) - Google Analytics