继承派生基本概念
1、为什么引入继承机制?
软件开发提倡“可重用性”高,而C++引入继承机制正是提高代码可重用性的方式之一。
2、继承与派生的基本概念
首先继承和派生讲的是一回事。
继承:在定义一个新的类B时,如果该类与某个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类(也称子类)。也称为B继承自A。
3、注意点
- 派生类是通过对基类进行修改和扩充得到的。所谓扩充,是指在派生类中,可以扩充新的成员变量和成员函数。所谓修改,是指在派生类中可以重写从基类继承得到的成员。
- 派生类一经定义后,可以独立使用,不依赖于基类。
- 派生类拥有基类的全部成员函数和成员变量,不论是private、protected、public 。(在派生类的各个成员函数中,不能访问基类中的private成员。)
- 派生类和基类拥有同名函数很常见 (支撑修改。),但是最好不要派生类和基类不要有同名成员变量。
4、继承的语法
//继承方式可以是:public、private、protected。一般情况下用public。
class 派生类名:public 基类名
{
};
5、派生类对象的内存空间
派生类对象的体积,等于基类对象的体积,再加上派生类对象自己的成员变量的体积。在派生类对象中,包含着基类对象,而且基类对象的存储位置位于派生类对象新增的成员变量之前。
class CBase
{
int v1,v2;
};
class CDerived:public CBase
{
int v3;
};
6、编程实战中继承的应用
在Windows面向对象的MFC编程、安卓系统应用程序编程等开发环境中,许多程序员需要写的关键类都继承自编译器提供的基类,而且红往往需要编写同名函数。并且同名函数时,一般先调用基类的同名函数完成必要功能。
7、举栗子:学籍管理
#include <iostream>
#include <string>
using namespace std;
class CStudent {
private:
string name;
string id; //学号
char gender; //性别,'F'代表女,'M'代表男
int age;
public:
void PrintInfo();
void SetInfo( const string & name_,const string & id_,
int age_,
char gender_ );
string GetName() { return name; }
};
class CUndergraduateStudent:public CStudent
{//本科生类,继承了CStudent类
private:
string department; //学生所属的系的名称
public:
void QualifiedForBaoyan() { //给予保研资格
cout << “qualified for baoyan” << endl;
}
void PrintInfo() {
CStudent::PrintInfo(); //派生类写同名函数,先调用基类的PrintInfo完成必要功能
cout << “Department:” << department <<endl;
}
void SetInfo( const string & name_,const string& id_,int age_,char gender_ ,const string &department_) {
CStudent::SetInfo(name_,id_,age_,gender_); //调用基类的SetInfo
department = department_;
}
};
void CStudent::PrintInfo()
{
cout << "Name:" << name << endl;
cout << "ID:" << id << endl;
cout << "Age:" << age << endl;
cout << "Gender:" << gender << endl;
}
void CStudent::SetInfo( const string & name_,const string & id_,int age_,char gender_ )
{
name = name_;
id = id_;
age = age_;
gender = gender_;
}
int main()
{
CUndergraduateStudent s2;
s2.SetInfo("Harry Potter ","118829212",19,'M',"Computer Science");
cout << s2.GetName() << " ";
s2.QualifiedForBaoyan ();
s2.PrintInfo ();
return 0;
}