继承和派生
1.继承和派生的概念
为什么使用继承的原因: 继承性质是自然的一种观念,现实世界的许多事情是具有继承性的。
继承通常的认识是从先辈哪里得到的属性和行为特征,然而类的继承就是从已经有的类那里得到已经有的特性,另一个方面看已有类产生新类的过程就是类的派生 。
对于类的继承和派生,程序员无需修改已有类,只需要已有类的基础上,通过增加少量代码或修改的方法得到新的类。
例如:
#include<iostream>
#include<string>
using namespace std;
class Person{
public:
Person(string name1,string id_number1,int age1);
~Person();
void show();
private:
string name ;
string id_number;
int age;
};
Person::Person(string name1,string id_number1,int age)
{
name=name1;
id_number=id_number1;
age=age1;
}
Person::~person()
{}
void Person::show()
{
cout<<"\n 姓名"<<name;
cout<<"\n 身份证号"<<id_number;
cout<<"\n 年龄"<<age;
}
class Student:public Person{
public:
Student(string name1,string id_number1,int age1,int credit);
~Student();
void show();
private:
int credit;
};
Student::Student(string name1,string id_number,int age,int credit)
:Person(name1,id_number1,age1)
{credit=credit1;
}
Student::~Student()
{}
void Student::show()
{ Person::show();
cout<< "\n学分" <<credit<<endl;
}
int main()
{
Student stu1("张国荣,"123456789",19,155);
stu1.show();
return 0;
}
2.派生类的声明
class Person{ //声明基类Person
public:
Person(string name1,string id_number,int age1);
~person();
void show(); //在基类中定义了了成员函数 show()
private:
string name;
string id_number;
class Student:public Person{
public:
Student(string name1,string id_number1,int age1,int credit);
~Student();
void show(); //在派生类中,重新定义成员函数show()
private:
int credit;
};
派生类除了可以从基类继承成员外,还可以增加自己的数据成员函数。这些新增的成员正是派生类不同于基类的关键所在,是派生类对基类的发展。
(1)可以增加新的数据成员。
(2)可以增加新的成员函数。
(3)可以对基类的成员进行重新定义。
(4)可以改变基类成员在派生类中的访问属性。
3.基类成员在派生类中的访问属性
不同派生方式下基类成员在派生类中的可访问范围属性
举一个例子说明该表的解读方法:第五行第三列说明,基类的公有成员经过私有派生后,在派生类中变为私有成员。
类的“不可访问”成员指的是类的成员函数内部也不能访问的成员。例如,基类的私有成员在派生类的成员函数内就不能访问,但它依然是派生类的成员,因此说基类的私有成员在派生类中成为不可访问成员。
使用公有派生,基类的公有成员将成为派生类的公有成员;基类的私有部分也将成为派生类的一部分,但属于“不可访问”成员,只能通过基类的公有和保护方法访问。
4.派生类对基类成员的访问规则
派生类对基类成员的访问形式分为以下两种:
(1)内部访问。由派生类中新增的成员函数随基类继承来的成员的访问。
(2)对象访问。在派生类外部,通过派生类的对象从基类继承来的成员的访问。
私有继承的访问规则
公有继承的访问规则
类的继承为公有继承时,基类的公有成员和保护成员被继承到派生类中仍作为派生类的公有成员和保护成员,派生类的其他成员可以直接访问他们。但是在类的外部只能通过派生类的对象访问继承来的公有成员,而不能访问继承来的保护成员。
保护继承的访问规则
同样的性质在类的外部不能通过派生类的对象来访问它们。