【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(私有)
  1. 继承方式为私有继承时,在派生类中,基类的公有成员和保护成员作为派生类的私有成员,派生类的成员函数可以访问它们,而在派生类外不能访问它们,只有基类的成员函数可以引用它们。在派生类的外部,派生类的对象无法访问基类的全部成员。

如例5-2程序中:

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

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

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

  2. 如果想要引用私有基类的私有成员,可以采取下面的方法:
    (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

结果和上一篇博客相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不雨_亦潇潇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值