【C++之私有继承】输入和输出 num, name, sex, age, addr

简介: 【C++之私有继承】输入和输出 num, name, sex, age, addr

题目要求


将例5.2的程序片段补充和改写成一个完整、正确的程序,用私有继承方式。在程序中应包括输入数据的函数,在程序运行时输入 num, name, sex, age, addr 的值,程序应输出以上5个数据。


——谭浩强的《C++面向对象程序设计》第5章习题第2小题


例5.2的程序片段:


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 : private Student // 以 private 方式声明派生类 Student1
{
public:
  void get_value_1() // 输入派生类数据 
  {
  cin >> age >> addr;
  }
  void display_1()  // 输出两个数据成员的值
  {
  cout << "age: " << age << endl;      // 引用派生类的私有成员
  cout << "address: " << addr << endl; // 引用派生类的私有成员
  }   
private:
  int age;
  string addr;
};


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


私有继承


在基类的访问属性

继承方式

在派生类中的访问属性

private(私有)

private(私有)

不可访问

public(公用)

private(私有)

private(私有)

protected(保护)

private(私有)

private(私有)


继承方式为私有继承时,在派生类中,基类的公有成员和保护成员作为派生类的私有成员,派生类的成员函数可以访问它们,而在派生类外不能访问它们,只有基类的成员函数可以引用它们。在派生类的外部,派生类的对象无法访问基类的全部成员。

如例5-2程序中:


stud1.display();     // 错误。私有基类的公用成员函数在派生类中是私有函数


display 函数属于私有基类,不能在派生类外访问。


私有继承之后,全部基类成员在派生类中都成为了私有成员或不可访问的成员,无法进一步派生。


如果想要引用私有基类的私有成员,可以采取下面的方法:

(1)通过基类的公用成员函数引用基类中的数据成员。


例如:


void get_value() // 输入基类数据的成员函数
  {
  cin >> num >> name >> sex; // 引用数据成员 num, name, sex
  }
  void display() // 输出基类数据的成员函数
  {
  cout << "num: " << num << endl;
  cout << "name: " << name << endl;
  cout << "sex: " << sex << endl; 
  // 引用数据成员 num, name, sex
  }


(2)通过派生类的公用成员函数调用基类的公用成员函数。


例如:


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


(3)在派生类外调用派生类的公用成员函数。

例如:


stud1.get_value_1(); // 调用派生类的公用成员函数,输入派生类两个数据成员的值
  stud1.display_1();   // 调用派生类的公用成员函数,输出派生类中两个数据成员的值


补充改写后的程序


/*
*************************************************************************
@file:    main.cpp
@date:   2020.11.26
@author: Xiaoxiao
@brief:   私有继承方式输入和输出 num,name,sex,age,addr
@blog:    https://blog.csdn.net/weixin_43470383/article/details/110140260
*************************************************************************
*/
#include <iostream>
using namespace std;
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;
  char name[10];
  char sex;
};
// 和上一篇博客唯一不同的地方:将公用继承改为私有继承
class Student1 : private Student // 以 private 方式声明派生类 Student1
{
public: // 派生类公用成员
  void get_value_1() // 输入派生类数据 
  {
  get_value(); // 调用基类的公用成员函数,输入3个数据成员的值
  cin >> age >> addr;
  }
  void display_1() // 输出两个数据成员的值
  {
  display(); // 调用基类的公用成员函数,输出两个数据成员的值
  cout << "age: " << age << endl;      // 引用派生类的私有成员
  cout << "address: " << addr << endl; // 引用派生类的私有成员
  }
private: // 派生类私有成员
  int age;
  char addr[30];
};
int  main()
{
  Student1 stud1;      // 定义派生类 Student1 的对象 stud1
  stud1.get_value_1(); // 调用派生类的公用成员函数,输入派生类两个数据成员的值
  stud1.display_1();   // 调用派生类的公用成员函数,输出派生类中两个数据成员的值
  system("pause");
  return 0;
}


运行结果



输入:

8 Xiaoxiao m 20 Guangzhou


输出:

num: 8

name: Xiaoxiao

sex: m

age: 20

address: Guangzhou


结果和上一篇博客相同。


相关文章
|
2天前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
34 16
|
2月前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
37 1
【C++】继承
|
6月前
|
编译器 C++
【C++】详解C++的继承
【C++】详解C++的继承
|
3月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
97 11
|
3月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
68 1
|
3月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
53 1
|
3月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
24 0
|
3月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
45 0
|
3月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
49 0
|
4月前
|
C++
C++(二十)继承
本文介绍了C++中的继承特性,包括公有、保护和私有继承,并解释了虚继承的作用。通过示例展示了派生类如何从基类继承属性和方法,并保持自身的独特性。此外,还详细说明了派生类构造函数的语法格式及构造顺序,提供了具体的代码示例帮助理解。