• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 详解C++编程中的私有继承和公有继承

详解C++编程中的私有继承和公有继承

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++指针详解,c++编程实例详解,c++关键字详解,c++编程实例详解pdf,c++ 虚函数详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

C++类的私有继承
在声明一个派生类时将基类的继承方式指定为private的,称为私有继承,用私有继承方式建立的派生类称为私有派生类(private derived class ), 其基类称为私有基类(private base class )。

私有基类的公用成员和保护成员在派生类中的访问属性相当于派生类中的私有成员,即派生类的成员函数能访问它们,而在派生类外不能访问它们。私有基类的私有成员在派生类中成为不可访问的成员,只有基类的成员函数可以引用它们。一个基类成员在基类中的访问属性和在派生类中的访问属性可能是不同的。私有基类的成员在私有派生类中的访问属性见下表。

上表不必死记硬背,只需理解:既然声明为私有继承,就表示将原来能被外界引用的成员隐藏起来,不让外界引用,因此私有基类的公用成员和保护成员理所当然地成为派生类中的私有成员。

私有基类的私有成员按规定只能被基类的成员函数引用,在基类外当然不能访问他们,因此它们在派生类中是隐蔽的,不可访问的。

对于不需要再往下继承的类的功能可以用私有继承方式把它隐蔽起来,这样,下一层的派生类无法访问它的任何成员。可以知道,一个成员在不同的派生层次中的访问属性可能是不同的,它与继承方式有关。

[例]

class Student1: private Student//用私有继承方式声明派生类Student1
{
public:
  void display_1( ) //输出两个数据成员的值
  {
   cout<<"age: "<<age<<endl; //引用派生类的私有成员,正确
   cout<<"address: "<<addr<<endl;
  } //引用派生类的私有成员,正确
private:
  int age;
  string addr;
};
</div>

请分析下面的主函数:

int main( )
{
  Student1 stud1;//定义一个Student1类的对象stud1
  stud1.display(); //错误,私有基类的公用成员函数在派生类中是私有函数
  stud1.display_1( );//正确,Display_1函数是Student1类的公用函数
  stud1.age=18; //错误,外界不能引用派生类的私有成员
  return 0;
}
</div>

可以看到:
不能通过派生类对象(如stud1)引用从私有基类继承过来的任何成员(如stud1.display()或stud1.num)。
派生类的成员函数不能访问私有基类的私有成员,但可以访问私有基类的公用成员(如stud1.display_1函数可以调用基类的公用成员函数display,但不能引用基类的私有成员num)。

不少读者提出这样一个问題:私有基类的私有成员mun等数据成员只能被基类的成员函数引用,而私有基类的公用成员函数又不能被派生类外调用,那么,有没有办法调用私有基类的公用成员函数,从而引用私有基类的私有成员呢?有。

应当注意到,虽然在派生类外不能通过派生类对象调用私有基类的公用成员函数,但可以通过派生类的成员函数调用私有基类的公用成员函数(此时它是派生类中的私有成员函数,可以被派生类的任何成员函数调用)。

可将上面的私有派生类的成员函数定义改写为:

void display_1( )//输出5个数据成员的值
{
  display(): //调用基类的公用成员函数,输出3个数据成员的值
  cout<<"age: "<<age<<endl; //输出派生类的私有数据成员
  cout<<"address: "<<addr<<endl;
} //输出派生类的私有数据成员
</div>

main函数可改写为:

int main( )
{
  Student1 stud1;
  stud1.display_1( );//display_1函数是派生类Student1类的公用函数
  return 0;
}
</div>

这样就能正确地引用私有基类的私有成员。可以看到,本例采用的方法是:
在main函数中调用派生类中的公用成员函数stud1.display_1;
通过该公用成员函数调用基类的公用成员函数display(它在派生类中是私有函数,可以被派生类中的任何成员函数调用);
通过基类的公用成员函数display引用基类中的数据成员。

请根据上面的要求,补充和完善上面的程序,使之成为完整、正确的程序,程序中应包括输入数据的函数。

由于私有派生类限制太多,使用不方便,一般不常使用。

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

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

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

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

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;
};
</div>

由于基类的私有成员对派生类来说是不可访问的,因此在派生类中的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;
};
</div>

然后在main函数中分别调用基类的display函数和派生类中的display_1函数,先后输出5个数据。

可以这样写main函数(假设对象stud中已有数据):

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

请根据上面的分析,写出完整的程序,程序中应包括输入数据的函数。

实际上,程序还可以改进,在派生类的display_1函数中调用基类的display函数,在主函数中只要写一行:

  stud.display_1();
</div>


即可输出5个数据。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++的虚析构详解及实例代码
  • C++二分查找(折半查找)算法实例详解
  • C++ 中指针和引用有什么区别详解
  • C++ 中函数重载、覆盖与隐藏详解
  • C++中指针指向二维数组实例详解
  • C++调用Python基础功能实例详解
  • C++中this指针用法详解及实例
  • C++中函数重载实例详解
  • C++中指针和引用的区别详解
  • C++模版函数详解

相关文章

  • 2017-07-23C语言中的const,free用法详解
  • 2017-05-28C++ 中约瑟夫环替换计数器m(数组解决)
  • 2017-05-28深入Main函数中的参数argc,argv的使用详解
  • 2017-05-28C++模版函数详解
  • 2017-05-28VC++实现View内容保存为图片的方法
  • 2017-05-28c++中typename和class的区别介绍
  • 2017-05-28解析四方定理的应用
  • 2017-05-28C/C++程序开发中实现信息隐藏的三种类型
  • 2017-05-28C语言中进制知识汇总
  • 2017-05-28C++变位词问题分析

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • c++加法高精度算法的简单实现
    • tcp socket客户端和服务端示例分享
    • 一波二叉树遍历问题的C++解答实例分享
    • C语言中函数声明与调用问题
    • c语言实现输入一组数自动从大到小排列的实例代码
    • C语言获取消耗内存的方法
    • tc编译的dos程序和vc编译的win32控制台程序的异同
    • 深入解读C++中的指针变量
    • C语言const的修饰符
    • C语言中对字母进行大小写转换的简单方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有