继承派生基本概念

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;
}
posted @ 2019-12-04 10:44  江南又一春  阅读(426)  评论(0编辑  收藏  举报