C++类的公用继承输入日志标题

在定义一个派生类时将基类的继承方式指定为public的,称为公用继承,用公用继承方式建立的派生类称为公用派生类(public derived class ),其基类称为公用基类(public base class )。

采用公用继承方式时,基类的公用成员和保护成员在派生类中仍然保持其公用成员和保护成员的属性,而基类的私有成员在派生类中并没有成为派生类的私有成员,它仍然是基类的私有成员,只有基类的成员函数可以引用它,而不能被派生类的成员函数引用,因此就成为派生类中的不可访问的成员。公用基类的成员在派生类中的访问属性见表11.1。

有人问,既然是公用继承,为什么不让访问基类的私有成员呢?要知道,这是C++中一个重要的软件工程观点。因为私有成员体现了数据的封装性,隐藏私有成员有利于测试、调试和修改系统。如果把基类所有成员的访问权限都原封不动地继承到派生类,使基类的私有成员在派生类中仍保持其私有性质,派生类成员能访问基类的私有成员,那么岂非基类和派生类没有界限了?这就破坏了基类的封装性。如果派生类再继续派生一个新的派生类,也能访问基类的私有成员,那么在这个基类的所有派生类的层次上都能访问基类的私有成员,这就完全丢弃了封装性带来的好处。保护私有成员是一条重要的原则。

[例11.1] 访问公有基类的成员。下面写出类的声明部分:

Class Student//声明基类
{
public: //基类公用成员
   void get_value( )
   {
      cin>>num>>name>>sex;
   }
   void display( )
   {
      cout<<" num: "<<num<<endl;
      cout<<" name: "<<name<<endl;
      cout<<" sex: "<<sex<<endl;
   }
private: //基类私有成员
   int num;
   string name;
   char sex;
};

class Student1: public Student //以public方式声明派生类Student1
{
public:
   void display_1( )
   {
      cout<<" num: "<<num<<endl; //企图引用基类的私有成员,错误
      cout<<" name: "<<name<<endl; //企图引用基类的私有成员,错误
      cout<<" sex: "<<sex<<endl; //企图引用基类的私有成员,错误
      cout<<" age: "<<age<<endl; //引用派生类的私有成员,正确
      cout<<" address: "<<addr<<endl;
   } //引用派生类的私有成员,正确
private:
   int age;
   string addr;
};

由于基类的私有成员对派生类来说是不可访问的,因此在派生类中的display_1函数中直接引用基类的私有数据成员num,name和sex是不允许的。只能通过基类的公用成员函数来引用基类的私有数据成员。可以将派生类Student1的声明改为

class Student1: public Student  //以public方式声明派生类Student1
{
public:
   void display_1( )
   {
      cout<<" age: "<<age<<endl; //引用派生类的私有成员,正确
      cout<<" address: "<<addr<<endl; //引用派生类的私有成员,正确
   }
private:
   int age;
   string addr;
};

然后在main函数中分别调用基类的display函数和派生类中的display_1函数,先后输出5个数据。
可以这样写main函数(假设对象stud中已有数据):

int main( )
{
   Student1 stud;//定义派生类Student1的对象stud
   stud.display( ); //调用基类的公用成员函数,输出基类中3个数据成员的值
   stud.display_1(); //调用派生类公用成员函数,输出派生类中两个数据成员的值
   return 0;
}

请根据上面的分析,写出完整的程序,程序中应包括输入数据的函数。
实际上,程序还可以改进,在派生类的display_1函数中调用基类的display函数,在主函数中只要写一行:
    stud.display_1();
即可输出5个数据。

时间: 2024-11-04 19:18:10

C++类的公用继承输入日志标题的相关文章

MiS603开发板 第十七章 图像之HDMI接口测试输入日志标题

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第十七章 图像之HDMI接口测试 17.1 HDMI概述 HDMI是High Definition Multimed

HTML6注册表单输入日志标题

一.找到元素. var d = document.getElementById("") var d = document.getElementsByName("") var d = document.getElementsByTagName("") var d = document.getElementsByClassName("")   二.操作元素. (一)操作内容 1.表单 value 赋值,取值   2.非表单 赋值,

扒一扒各大电商网站的m站都用的什么前端技术输入日志标题

凡客首页使用Swiper和zepto,没有使用jquery , 静态首页+js交互,  资源加载使用 lazyLoad X-AspNet-Version: 4.0.30319 X-AspNetMvc-Version: 3.0 X-Powered-By: ASP.NET Accept-Encoding: gzip, deflate, sdch 框架 zepto.js和jquery.js函数都差不多啊,zepto.js有什么优点呢     淘宝也使用了  zepto.js,还有 aplus.0.2.

搭载Azure的开发环境及相关资源的使用输入日志标题

搭载Azure的开发环境及相关资源的使用 从http://azure.microsoft.com/zh-cn/downloads/?rnd=1下载azure开发工具,Visual Studio 2013 update 4 ; 安装好之后,下载Azure SDK, 下载后,通过 Microsoft Web平台安装程序来获得并安装它们.接下来,你去可以微软下载官网,下载试用版的SQL-Server 2014 : 现在我们就可以导入Azure 订阅了: 首先,从https://manage.windo

Image Transformation in WPF输入日志标题

Image transformation is a process of rotating and scaling images. Rotating Images There are two ways to rotate an image. First option is to use the Rotation property of BitmapImage and second option is use a TransformBitmap image. The TransformBitmap

HTML4如何让一个DIV居中对齐?float输入日志标题

float:left,right clear:both 如何让一个DIV居中对齐? 第一步:设置外层的DIV的text-align:center; 第二步:设置里层的DIV的margin:auto 以上两个DIV都不要设置float.                  

Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法输入日志标题

安装Oracle 11gR2,报错:[INS-06101] IP address of localhost could not be determined 出现这种错误是因为主机名和/etc/hosts 文件不一致,只需要把主机名和其IP 写入/etc/hosts 文件,就ok了. 查看主机名和和ip 地址关系: [[email protected]~]# cat /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=

C#中的String.Format方法输入日志标题

一.定义 String.Format是将指定的 String类型的数据中的每个格式项替换为相应对象的值的文本等效项. 如: (1) string p1 = "Jackie"; string p2 = "Aillo"; Response.Write(String.Format("Hello {0}, I'm {1}", p1, p2)); (2) Response.Write(String.Format("Hello {0}, I'm {

Component组件输入日志标题

Component    组件: Mesh:网格 Mesh Filter:网格过滤器 Text Mesh:文本网格 Mesh Renderer:网格渲染 Particles:粒子 Ellipsoid Particle Emitter:椭球粒子发射器 Mesh Particle Emitter:网格粒子发射器 Particle Animator:粒子动画 World Particle Collider:世界粒子对撞机 Particle Renderer:粒子渲染器 Trail Renderer:尾