一、继承和派生的基本概念
“继承”就是支持代码重用的机制之一
二、什么是派生?
书本概念;从一个或多个以前定义的类(基类)产生新类的过程称为派生。这个新类称为派生类。
自己理解:就像我们自己在写程序的时候写一个学生类,这个学生类是一个抽象的,具体不知道是那些学生,因为学生的范围很广,包括小学生,中学生,大学生等等,所以为了具体一点我们需要创建新类,创建小学生,中学生,大学生等类,它具有学生类的属性,所以创建这个新类的过程就是派生。
派生类除了拥有基类的成员,还可以定义自己的新成员,以增强类的功能
三、类的继承
类的继承是指派生类继承基类的数据成员和成员函数。继承常用来表示类属关系,不能将继承理解为构成关系。
当从现有类中派生出新类时,派生类可以有以下几种变化:
1.增加新成员(数据成员和成员函数)。
2.重新定义已有的成员函数
3.改变基类的访问权限。
继承实例,定义一个基类 People,然后由此派生出 Student 类:
#include<iostream>
using namespace std;
//基类 Pelple
class People{
public:
void setname(char *name);
void setage(int age);
char *getname();
int getage();
private:
char *m_name;
int m_age;
};
void People::setname(char *name){ m_name = name; }
void People::setage(int age){ m_age = age; }
char* People::getname(){ return m_name; }
int People::getage(){ return m_age;}
//派生类 Student
class Student: public People{
public:
void setscore(float score);
float getscore();
private:
float m_score;
};
void Student::setscore(float score){ m_score = score; }
float Student::getscore(){ return m_score; }
int main(){
Student stu;
stu.setname("小明");
stu.setage(16);
stu.setscore(95.5f);
cout<<stu.getname()<<"的年龄是 "<<stu.getage()<<",成绩是 "<<stu.getscore()<<endl;
return 0;
}
语法为
class 派生类名:[继承方式] 基类名{
派生类新增加的成员
};
在面向对象的程序设计中有几类修饰符,通过修饰符才可以修饰类的成员,还可以指定继承方式。
继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的)、private(私有的)和 protected(受保护的)。如果不写,默认为 private(成员变量和成员函数默认也是 private)
四、修饰符
public、protected、private 指定继承方式
不同的继承方式会影响基类成员在派生类中的访问权限。
1.public继承方式
- 基类中所有 public 成员在派生类中为 public 属性;
- 基类中所有 protected 成员在派生类中为 protected 属性;
- 基类中所有 private 成员在派生类中不能使用。
2. protected继承方式
- 基类中的所有 public 成员在派生类中为 protected 属性;
- 基类中的所有 protected 成员在派生类中为 protected 属性;
- 基类中的所有 private 成员在派生类中不能使用。
3.private继承方式
- 基类中的所有 public 成员在派生类中均为 private 属性;
- 基类中的所有 protected 成员在派生类中均为 private 属性;
- 基类中的所有 private 成员在派生类中不能使用。
继承方式/基类成员 | public成员 | protected成员 | private成员 |
public继承 | public | protected | 不可见 |
protected继承 | protected | protected | 不可见 |
private继承 | private | private | 不可见 |
五、 单一继承和多重继承
什么是单一继承?
一个类从一个基类派生。
在C++课本中体现了,但是继承的一般形式如下:
Class 派生类名:访问控制 基类名{
private:
成员声明列表
protected:
成员声明列表:
public:
成员声明列表
};
什么是多重继承?
一个类从多个基类派生。
Class 类名1:访问控制 类名2,访问控制 类名3……..访问控制 类名n
{….//定义派生类自己的成员};
演示类的继承关系
#include<iostream>
using namespace std;
//基类People
class People{
public:
void setname(char *name);
void setage(int age);
void sethobby(char *hobby);
char *gethobby();
protected:
char *m_name;
int m_age;
private:
char *m_hobby;
};
void People::setname(char *name){ m_name = name; }
void People::setage(int age){ m_age = age; }
void People::sethobby(char *hobby){ m_hobby = hobby; }
char *People::gethobby(){ return m_hobby; }
//派生类Student
class Student: public People{
public:
void setscore(float score);
protected:
float m_score;
};
void Student::setscore(float score){ m_score = score; }
//派生类Pupil
class Pupil: public Student{
public:
void setranking(int ranking);
void display();
private:
int m_ranking;
};
void Pupil::setranking(int ranking){ m_ranking = ranking; }
void Pupil::display(){
cout<<m_name<<"的年龄是"<<m_age<<",考试成绩为"<<m_score<<"分,班级排名第"<<m_ranking<<",TA喜欢"<<gethobby()<<"。"<<endl;
}
int main(){
Pupil pup;
pup.setname("小明");
pup.setage(15);
pup.setscore(92.5f);
pup.setranking(4);
pup.sethobby("乒乓球");
pup.display();
return 0;
}
运行结果:
小明的年龄是15,考试成绩为92.5分,班级排名第4,TA喜欢乒乓球。