C++的继承方式有三种,分别为:

    公有继承:public
私有继承:private
保护继承:protected

定义格式为:

class<派生类名>:<继承方式><基类名>
{
<派生类新定义成员>
};

我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。

在公有继承(public)时,

基类的公有成员和保护成员作为派生类的成员时,

它们都保持原有的状态,而基类的私有成员仍然是私有的,不能

被这个派生类的子类所访问。

#include<iostream>
using namespace std;
class People {
private:
char *name = NULL;
int ID;
char *gender = NULL;
float height;
public:
People();
People(char Name[], int id, char Gender[], float Height, char Address[]);
int GetID();
float Getheight();
void DisplayPeople();
char* Getname();
char* Getgender();
char* Getaddress();
protected:
char *address = NULL;
};
People::People()
{ }
char* People::Getaddress()
{
return address;
}
char* People::Getgender()
{
return gender;
}
char* People::Getname()
{
return name;
}
void People::DisplayPeople()
{
cout << "姓名:" << name << endl;
cout << "身份证号:" << ID << endl;
cout << "性别:" << gender << endl;
cout << "身高:" << height << endl;
cout << "地址:" << address << endl;
}
People::People(char Name[], int id, char Gender[], float Height, char Address[])
{
name = Name;
ID = id;
gender = Gender;
height = Height;
address = Address;
}
int People::GetID()
{
return ID;
}
float People::Getheight()
{
return height;
}
class Student :public People//类Student以公有继承的方式继承类People
{
private:
int StudentId;
char *Class;
public:
Student(char Name[], int id, char Gender[], float Height, char Address[], int studentid, char clas[]);
void DisplayStudent();
Student();
float GetHeight();
};
float Student::GetHeight()
{
return Student::Getheight();
}
Student::Student()
{ }
void Student::DisplayStudent()
{
cout << endl;
People::DisplayPeople();
cout << "学生学号:" << StudentId << endl;
cout << "学生所在班级:" << Class << endl;
}
Student::Student(char Name[], int id, char Gender[], float Height, char Address[], int studentid, char clas[]) :People(Name, id, Gender, Height, Address)
//派生类的构造函数
{
StudentId = studentid;
Class = clas;
}
int main()
{
char s1[20];
cout << "输入姓名 :";
cin >> s1;//输入姓名
char s2[10];
cout << "输入性别 :";
cin >> s2;//输入性别
char s3[15];
cout << "输入地址 :";
cin >> s3;//输入地址
int a;
cout << "请输入身份证号:";
cin >> a;
float b ;
cout << "请输入身高:";
cin >> b;
People people(s1, a, s2, b, s3);
char S1[20];
cout << "输入所在班级 :";
cin >> S1;//输入所在班级
int number;
cout << "输入学号 :";
cin >> number;//输入学号
Student student1(s1, a, s2, b, s3, number, S1);
student1.DisplayStudent();//派生类调用基类中的public成员函数
cout << endl << student1.Getheight() << endl;//派生类调用基类的成员函数访问基类的私有成员height
system("pause");
return 0;
}

这个派生类采用公有继承方式,所以可以调用基类中的成员函数。但若我们用派生类直接访问基类中的私有成员,

cout << student1.ID << endl;

则会出现以下错误:



说明派生类也不可直接访问基类中的私有成员。

在私有继承(private)时,

基类的公有成员和保护成员都作为派生类的私有

成员,并且不能被这个派生类的子类所访问。

在上面代码不变的基础上,将继承方式由公有继承(public)改为私有继承(private),

class Student :private People//类Student以私有继承的方式继承类People
{
private:
int StudentId;
char *Class;
public:
Student(char Name[], int id, char Gender[], float Height, char Address[], int studentid, char clas[]);
void DisplayStudent();
Student();
float GetHeight();
};

会发生如下报错:

说明在私有继承中,基类中的成员函数对于派生类来说是不可见的,不被允许访问的,若我们想访问基类中的

私有成员变量,可以通过派生类成员函数间接地访问,代码如下:

float Student::GetHeight()
{
cout << endl<< "访问基类成员height成功:";
return Student::Getheight();
}

在派生类函数中,我们调用了基类成员函数成功访问了基类私有成员。

在保护继承(protected)时,

基类的所有公有成员和保护成员都成为派生类

的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员

仍然是私有的。

将继承方式改为保护继承(protected),

class Student :protected People//类Student以保护继承的方式继承类People
{
private:
int StudentId;
char *Class;
public:
Student(char Name[], int id, char Gender[], float Height, char Address[], int studentid, char clas[]);
void DisplayStudent();
Student();
float GetHeight();
};

此时,当我们通过派生类访问基类成员函数时,

cout << student1.DisplayPeople() << endl;
cout << student1.Getgender() << endl;

报错提示函数DisplayPeople() ,Getgender()不能被直接访问,因为在保护继承方式中,基类的public成员

对于派生类而言是protected成员,不能被直接访问。

若我们想要访问,可以通过构造派生类的成员函数访问,如下:

char* Student::GetPeopleName()
{
return People::Getname();
}

结语

通过对累的派生,我们可以使一个类的属性多样化,也有利于我们后期的设计。

最新文章

  1. 每天一个 Linux 命令(21):find命令之xargs
  2. CSS 学习笔记
  3. 浅谈javascript中事件冒泡与事件捕获
  4. win7操作系统32位或是64位系统上安装 sql2005 点滴
  5. 【bzoj2819】 Nim
  6. 关于HttpWebRequest.KeepAlive
  7. 比较不错的一个ios找茬游戏源码
  8. ASP.NET 运行机制续(完结)
  9. Java学习第一篇:变量,数据类型,运算符,流程控制(简介)
  10. 5 MySQL索引
  11. 使用Fiddler获取OAuth2认证的access token时候返回502
  12. P1462 通往奥格瑞玛的道路 最短路
  13. codeforces645B
  14. matplotlib中color可用的颜色
  15. 解决access 导出 excel 字段截断错误的问题
  16. python之GIL release (I/O open(file) socket time.sleep)
  17. HTML5 CSS Reset
  18. SharePoint自动化系列——通过PowerShell在SharePoint中批量做数据
  19. double类型保留2位小数
  20. iOS 上的蓝牙框架 - Core Bluetooth for iOS

热门文章

  1. 官方支持的全新版Neo4j-JDBC驱动3.0
  2. python Web中WSGI uWSGI 以及 uwsgi的区别
  3. CodePlus2017 12月月赛 div2火锅盛宴
  4. Mysql+php报错原因
  5. php实现希尔排序
  6. FastAdmin 自学教程 - 目录(持续更新)(2019-10-11)
  7. oracle如何启用审计
  8. phpmyadmin误删表后的恢复过程
  9. Hdu 4493
  10. Vim学习与总结