继承

继承

一、类之间的关系 

继承: 已有类 的基础上 创建新类 的过程
  一个 B 类继承 A 类,或称从类 A 派生类 B

 A 称为基类(父类),类B称为派生类(子类)

二、基类和派生类

类继承关系的语法形式
	class 派生类名 : 基类名表
 	{
	      数据成员和成员函数声明
 	};

基类名表 构成

  访问控制  基类名1访问控制  基类名2访问控制  基类名n

访问控制表示派生类对基类的继承方式,使用关键字:

    public  公有继承

   private    私有继承

    protected  保护继承

2.

派生类的生成过程经历了三个步骤:

       ●吸收基类成员(全部吸收(构造、析构除外),但不一定可见

        C++的继承机制中,派生类吸收基类中除构造函数和析构函数之外的全部成员。 

       ●改造基类成员

        通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽(隐藏)在派生类中不起作用的部分基类成员。

       ●添加派生类新成员

        仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现。 

例如:

定义一个基类 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;
	}
};

3.重名成员

在派生类中使用基类的同名成员,显式地使用类名限定符:

类名:: 成员

(1)重名数据成员 

例:

class  base
  { public :
           int  a ,  b ;  
  } ;
class  derived : public  base
  { public :  
         int  b ,  c ; 
  } ;
void  f ()
{ derived  d ;
   d . a = 1 ;
   d . base :: b = 2 ;
   d . b = 3 ;
   d . c = 4 ;
};

4.派生类中访问静态成员

  • 基类定义的静态成员,将被所有派生类共享(基类和派生类共享基类中的静态成员)
  • 根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质
  • 派生类中访问静态成员,用以下形式显式说明:类名:: 成员      或通过对象访问  对象名 . 成员 

三、基类的初始化

  • 在创建派生类对象时用指定参数调用基类的构造函数来初始化派生类继承基类的数据
  • 派生类构造函数声明为

    派生类构造函数 ( 变元表 ): 基类 ( 变元表 ), 对象成员1(变元表 )

       … 对象成员n ( 变元表)

  • 构造函数执行顺序:基类->对象成员->派生类

2.派生类构造函数和析构函数的定义规则

派生类构造函数和析构函数的使用原则

1. 基类的构造函数和析构函数 能被继承
2. 如果基类 没有定义构造函数 有无参的构造函数 ,派生类也 可以不用 定义构造函数
3. 如果基类 无参的构造函数 ,派生类 必须 定义构造函数
4. 如果派生类的基类也是派生类,则每个派生类 只负责直接 基类的构造
5. 派生类是否定义析构函数与所属的基类无关

四、多继承

1.一个类有多个直接基类的继承关系称为多继承  

2.

多继承声明语法

class  派生类名: 访问控制  基类名1访问控制  基类名2,  … , 访问控制  基类名n

    {

         数据成员和成员函数声明

    }

3.

多继承方式下构造函数的执行顺序:

执行所有基类的构造函数

执行对象成员的构造函数

最后执行派生类的构造函数

4.赋值兼容规则 

赋值兼容规则指在程序中需要使用基类对象的任何地方,都可以用公有派生类的对象来替代。

5.注意的问题

1)声明为指向基类的指针可以指向它的公有派生类的对象,但不允许指向它的私有派生类的对象。

2)允许将一个声明为指向基类的指针指向其公有派生类对象,但是不能将一个声明为指向派生类对象的指针指向其基类的一个对象。

  (3) 声明为指向基类对象的指针,当其指向公有派生类对象时,只能用它来直接访问派生类中从基类继承来的成员,而不能直接访问公有派生类的定义的成员

五、心得体会

继承的一个最大的作用就是可以减少代码的重复书写,来达到简化程序的目的。我们在使用继承时可以找出两个类或几个类之间的相同的地方,把相同的部分作为一个基类来单独定义。用的时候可直接调用。子类可以继承父类私有成员,但不能使用,父类成员尽量不定义成私有的。尽量不要用多继承。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值