继承 总结

一,基础知识
1,类之间的关系
继承:在已有类的基础上创建新类的过程
  一个 B 类继承A类,或称从类 A 派生类 B
  类 A 称为基类(父类),类 B 称为派生类(子类)
2,基类和派生类
(1)类继承关系的语法形式
class 派生类名 : 基类名表
  {
      数据成员和成员函数声明
  };
基类名表  构成
访问控制  基类名1, 访问控制  基类名2 ,… , 访问控制  基类名n
(2)访问控制 表示派生类对基类的继承方式,使用关键字:
  public 公有继承
  private 私有继承
  protected 保护继承
(3)派生类的生成过程经历了三个步骤:
       a 吸收基类成员(全部吸收(构造、析构除外),但不一定可见)
       b 改造基类成员
       c 添加派生类新成员
a 吸收基类成员:在C++的继承机制中,派生类吸收基类中除构造函数和析构函数之外的全部成员。 
b 改造基类成员:通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽(隐藏)在派生类中不起作用的部分基类成员。
c 添加新成员:仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现。 
3,重名成员:派生类定义了与基类同名的成员,在派生类中访问同名成员时屏蔽(hide)了基类的同名成员。
在派生类中使用基类的同名成员,显式地使用类名限定符:类名 :: 成员 
4,派生类中访问静态成员
(1)基类定义的静态成员,将被所有派生类共享(基类和派生类共享基类中的静态成员)
(2)根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质 。
(3) 派生类中访问静态成员,用以下形式显式说明:
     类名 :: 成员或通过对象访问 对象名.成员
5,基类的初始化
   在创建派生类对象时用指定参数调用基类的构造函数来初始化派生类继承基类的数据。
   派生类构造函数声明为:
   派生类构造函数 ( 变元表 ) : 基类 ( 变元表 ) , 对象成员1( 变元表 )… 对象成员n ( 变元表 ) ; 
   构造函数执行顺序:基类 ? 对象成员 派生类
6,派生类构造函数和析构函数的定义规则
   派生类构造函数和析构函数的使用原则
   (1)基类的构造函数和析构函数不能被继承;
   (2)如果基类没有定义构造函数或有无参的构造函数,派生类也可以不用定义构造函数;
   (3)如果基类无无参的构造函数,派生类必须定义构造函数;
   (4)如果派生类的基类也是派生类,则每个派生类只负责直接基类的构造;
   (5)派生类是否定义析构函数与所属的基类无关
7,派生类构造函数的定义:在C++中,派生类构造函数的一般格式为:
      派生类::派生类名(参数总表):基类名(参数表)
     {
             // 派生类新增成员的初始化语句
     }
     注意:这是基类有构造函数且含有参数时使用
8,派生类析构函数
(1)当派生类中不含对象成员时
a 在创建派生类对象时,构造函数的执行顺序是:基类的构造函数→派生类的构造函数;
b 在撤消派生类对象时,析构函数的执行顺序是:派生类的析构函数→基类的析构函数。
(2)当派生类中含有对象成员时
a 在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;
c 在撤消派生类对象时,析构函数的执行顺序:派生类的析构函数→对象成员的析构函数→基类的析构函数。

例:

#include<iostream.h>
class base
{
public:
	base(){cout<<"constructing base class"<<endl;}
	~base(){cout<<"destructing base class"<<endl; }
};
class subs:public base
{
public:
	subs(){cout<<"constructing sub class"<<endl;}
	~subs(){cout<<"destructing sub class"<<endl;}
};
void main()
{
	subs s;
}
/*  运行结果:constructing base class
              constructing sub class
              destructing sub class
              destructing base class
*/
9,多继承
一个类有多个直接基类的继承关系称为多继承
  多继承声明语法
class  派生类名 : 访问控制  基类名1 ,  访问控制  基类名2 ,  … , 访问控制  基类名n
    {
         数据成员和成员函数声明
    };
二,例题总结
定义一个基类person(不定义构造函数)
姓名、性别、年龄(访问权限设置为私有)
定义公有的成员函数set_p()
定义公有的成员函数display_p(),显示person的信息
再由基类派生出学生类(不定义构造函数,采用公有继承的方式)
增加学号、班级、专业和入学成绩 
定义公有成员函数set_t()

定义成员函定义公有的成员函数display_s(),显示所有的信息

#include<iostream>
#include <string>
using namespace std;
class Person
{
	string name;
	int age;
	string sex;
public:
	void set_p()	{
		cout<<"name\tage\tsex"<<endl;
		cin>>name>>age>>sex;
	}
	void show_p()	{
 		cout<<name<<"  "<<age<<"  "<<sex<<endl;
	}
};
class student :public Person
{
	string no;
	string zhuanye;
	string t_class;
	float score;
public:
	void set_t(){
  	    set_p(); //调用继承于基类的成员函数访问继承于基类的私有数据成员
	    cout<<"zhuanye\tt_class\tscore"<<endl;
	    cin>>zhuanye>>t_class>>score;
	}
	void show_t()	{
		show_p();
		cout<<zhuanye<<"  "<<t_class<<"  "<<score<<endl;
	}
};
//该问题的第二种解法:
#include<iostream>
#include <string>
using namespace std;
class Person
{

	string name;
	int age;
	string sex;
public:
	void set()	{
		cout<<"name\tage\tsex"<<endl;
		cin>>name>>age>>sex;
	}
	void show()	{
 		cout<<name<<"  "<<age<<"  "<<sex<<endl;
	}
};
class student :public Person
{
	string no;
	string zhuanye;
	string t_class;
	float score;
public:
	void set(){    //隐藏了基类中的同名成员       
	     Person::set(); //调用继承于基类的成员函数访问继承于基类的数据成员
   	     cout<<"zhuanye\tt_class\tscore"<<endl;
	     cin>>zhuanye>>t_class>>score;
	}
	void show()	{
		Person::show();
		cout<<zhuanye<<"  "<<t_class<<"  "<<score<<endl;
	}
};
三,心得体会
      继承是面向对象程序设计实现软件重用的重要方法。继承的使用可以大大缩短代码长度,比如近期在做的图书管理系统,将记录类单独作为基类写,然后由图书和用户类继承,可以缩短将近一半的代码。在写大型软件时使用继承可以大大降低开发难度。总之继承是个很好的工具,在以后的学习中要多多尝试着用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值