C++继承方式
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();
}

结语
通过对累的派生,我们可以使一个类的属性多样化,也有利于我们后期的设计。
C++继承方式的更多相关文章
- js的三种继承方式及其优缺点
[转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...
- JavaScript继承方式详解[转]
js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现 ...
- 从jQuery中学习来的另一种继承方式(技巧)
遵从Js的原型链规则,利用js灵活的特性灵活地改造原型,可以实现各种创意地继承方式,昨天研究了jQuery,对作者实现继承的方式感到佩服,他对js原型和原型链的理解比较透彻,运用自如.这里给出jQue ...
- 重新理解JS的6种继承方式
写在前面 一直不喜欢JS的OOP,在学习阶段好像也用不到,总觉得JS的OOP不伦不类的,可能是因为先接触了Java,所以对JS的OO部分有些抵触. 偏见归偏见,既然面试官问到了JS的OOP,那么说明这 ...
- js两种定义函数、继承方式及区别
一:js两种定义函数的方式及区别 1:函数声明: function sayA() { alert("i am A"); } 2:函数表达式: var sayB = function ...
- 谈谈JavaScript的2种主要继承方式
今天给自己巩固一下js的继承知识,基础不好,有不对的地方,请尽量拍砖,越重越好. js继承方法最主要的是2种,一种是通过原型的方式,一种是通过借用call&apply的构造函数方式. 1.原型 ...
- C++的三种继承方式简述
C++对父类(也称基类)的继承有三种方式,分别为:public继承.protected继承.private继承.三种继承方式的不同在于继承之后子类的成员函数的"可继承性质". 在说 ...
- C++学习15 继承权限和继承方式
C++继承的一般语法为: class 派生类名:[继承方式] 基类名{ 派生类新增加的成员 }; 继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的).private(私有的)和 ...
- Javascript的四种继承方式
在Javascript中,所有开发者定义的类都可以作为基类,但出于安全性考虑,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码,因为这些代码可以被用于恶意攻击. 选定基类后,就可 ...
- JavaScript之四种继承方式讲解
在Javascript中,所有开发者定义的类都可以作为基类,但出于安全性考虑,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码,因为这些代码可以被用于恶意攻击. 选定基类后,就可 ...
随机推荐
- pyenv虚拟环境管理python多版本和软件库
可能大家在日常工作中会遇到这么个问题,现在基本的linux系统都是自带老版本的python2.7.x版本,我又不想用老版本,但直接升级可能会出问题,或是依赖老版本的程序就运行不了,有没办法能安装3.x ...
- 互联网安全的必要性:CSDN用户信息泄露案告破
本报讯 昨天,记者从北京警方获悉,历时40多天的侦查,轰动互联网的“CSDN网站用户信息泄露案”告破,涉案嫌疑人已被刑拘.由于保密措施不力,北京警方还向CSDN网站开出我国落实信息安全等级保护制度以来 ...
- 【风马一族_Android】无线连接|调试Android手机
原文来自:http://www.cnblogs.com/sows/p/6269396.html (博客园的)风马一族 侵犯版本,后果自负 2017-01-10 15:03:31 准备阶段 1. 软 ...
- vs dump调试
1. dump文件和pdb文件的匹配问题 >> 发布二进制文件时生成的pdb文件一定要保留,只有当发布的二进制文件和pdb文件是同时生成的才好正确调试. 2. dump文件和pdb文件放在 ...
- qt绘制渐变区域
// 原理:通过点到线,然后叠加成区域.同理,可使用其他图形 QPainter painter(m_pWidget); QLinearGradient linearGradient(QPointF(, ...
- java memory allocation(转)
Java的运行时数据存储机制 Java程序在运行时需要为一系列的值或者对象分配内存,这些值都存在什么地方?用什么样的数据结构存储?这些数据结构有什么特点?本文试图说明此命题的皮毛之皮毛. 概念 对 ...
- Django中blank和NULL
当我们在django中添加一个数据库字段时,我们通常会写models.CharField(max_length = 100,null = True,blank = True).用ForeignKey, ...
- 连接池c3p0
连接池c3p0 C3P0:hibernate和spring使用,有自动回收空闲连接的功能. 使用步骤: 1.导入jar包(c3p0-0.9.1.2.jar) 2.使用api a.硬编码(不推荐) ne ...
- oracle在不知道用户密码的时候,怎么样跳转到另外一个用户执行操作后并不影响该用户?
我们通过如下的方法,可以安全使用该用户,然后再跳转回来,在某些时候比较有用 需要Alter user权限或DBA权限: SQL> select password from dba_users w ...
- pl/sql进阶一控制结构
在任何计算机语言(c,java,c#,c++)都有各种控制语句(条件语句,循环结构,顺序控制结构…),在pl/sql中也存在这样的控制结构. 在本部分学校完毕后,希望大家达到: 1)使用各种if语句 ...