题目要求
将例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
结果和上一篇博客相同。