前言
继承可以在已有类的基础上创建新的类,新类可以从一个
(或多个)已有类中继承成员函数和数据成员,而且可以重新
定义或加进新的数据成员和函数。
简而言之,基类综合了派生类的公共信息,派生类则在基类
的基础上增加某些特性。
我们可以举一个使用继承的例子:
#include<string>
#include<iostream>
using namespace std;
class Person{
private:
string name;
int age;
string id_number;
public:
Person(string na,int ag,string id);
void show();
~Person();
};
Person::~Person(){
};
Person::Person(string na,int ag,string id){
name=na;
age=ag;
id_number=id;
}
void Person::show(){
cout<<"\n 姓名:"<<name;
cout<<"\n 年龄:"<<age;
cout<<"\n 身份证号:"<<id_number;
}
class Student:public Person{
private:
int score;
public:
Student(string na,int ag,string id,int score1);
void show();
~Student();
};
Student::Student(string na,int ag,string id,int score1)
:Person(na,ag,id) 注意点1
{
score=score1;
}
Student::~Student(){
};
void Student::show(){
Person::show(); 注意点2
cout<<"\n 成绩:"<<score;
}
int main(){
Student stu1("张三",19,"123456",200);
stu1.show();
return 0;
}
以下为运行结果:
从这一段代码中我们可以提出以下几个问题:
- 子类是否能访问父类?什么样的子类能访问父类?
- 在调用子类的构建、调用、析构函数时,父类是否对此产生影响?
1.基本使用及易错点
基本使用
声明一个派生类的一般格式是:
class 派生类名 :【继承方式】 基类名{ 派生类新增的数据成员和成员函数 }
需要注意的是派生类的析构函数
以上例:
构造函数:
Student::Student(string na,int ag,string id,int score1)
:Person(na,ag,id) 注意点1
{
score=score1;
}
访问
派生类可以继承基类中除了构造函数与析构函数之外的成员,但是这些成员的访问属性在派生过程中是可以调整的。从基类继承来的成员在派生类中的访问属性是由继承方式控制的。
①基类中的私有成员。
无论哪种继承方式,基类中的私有成员都不允许派生类继承,即在派生类中是不可直接访问的。
②基类中的公有成员。
都是以继承方式为主,继承方式是什么那么公有成员就会以什么身份出现。
③基类中的保护成员。
**公有继承时,基类中的所有公有成员在派生类中仍是以保护成员的身份出现的。**剩下与上条相同。
访问形式
派生类对基类成员的访问形式主要有两种:
1)内部访问,由派生类中新增的成员函数对基类继承来的成员的访问
2)对象访问,在派生类外部,通过派生类的对象对从基类继承来的成员的访问。
基类成员只可从内部由派生类访问,且私有数据成员永不可被派生类访问。