C++继承与派生

面向对象程序设计有4个主要特点,抽象,封装,继承和多态性。C++提供了类的继承机制,极好地解决了软件重用问题。C++的继承可以分为单继承和多继承两类。子类又被称为派生类,父类又被称为基类,派生类中的成员包含两部分:1.类是从基类继承过来的。2.类是自己增加的成员。
从基类继承过来的表现其共性,而新增的成员表现其个性。
1.继承的基本语法
class 子类:继承方式  父类1,继承方式 父类2,继承方式 父类3......


2.继承方式
继承有三种方式:1.公有继承 2.私有继承 3.保护继承


2.1.公有继承
2.1.1 基类的公有成员,保护成员在派生类中仍将保持原来的访问属性
2.1.2 派生类的成员函数可以访问基类的公有成员和保护成员,不能访问基类的私有成员
2.1.3 派生类以外的其他函数可以通过派生类的对象访问从基类继承来的公有成员
2.2.保护继承
2.2.1 基类的公有成员,保护成员在派生类中都变为protected访问属性
2.2.2 派生类的成员函数可以访问基类的公有成员和保护成员,不能访问基类的私有成员
2.2.3 派生类以外的其他函数不可以通过派生类的对象访问从基类继承的公有成员
2.3.私有继承
2.3.1 基类的公有成员,保护成员在派生类中都变为private访问属性
2.3.2 派生类的成员函数可以访问基类的公有成员和保护成员,不能访问基类的私有成员
2.3.3 派生类以外的其他函数不可以通过派生类的对象访问从基类继承的公有成员




3.继承中的对象模型
问题:从父类继承过来的成员,哪些属于子类对象中?


父类中所有非静态成员属性都会被子类继承下去
父类中私有成员属性是被编译器给隐藏了,因此是访问不到的,但是的确被继承下去了
4.继承中构造和析构顺序
子类继承父类后,当创建子类对象,也会调用父类的构造函数
问题:父类和子类的构造和析构顺序谁先谁后?



总结:继承中先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反
C++类的派生类继承了基类中除构造函数和析构函数之外的所有成员。基类的构造函数和析构函数不能被派生类所继承,派生类需要定义自己的构造函数和析构函数。
派生类构造函数定义的一般形式为
派生类名::派生类名(基类所需要的形参,本类成员所需的形参):基类1(基类1 形参表),基类2(基类2 参数表),.... ,基类n(基类n 参数表),对象成员1(对象1 参数表),对象成员2(对象2参数表),...  ,对象成员m(对象m参数表)
{
//本类基本类型数据成员初始化
}




如果使用基类无参构造函数,派生类构造函数形参表中不包含供给基类构造函数的参数。例如,前面代码中,如果基类base1和base2不定义构造函数,使用默认的构造函数,则派生类deriver的构造函数为

需要强调的是,基类没有定义带参的构造函数时,才可以这样用。
如果使用对象数据成员的无参构造函数,派生类构造函数形参表中不包含初始化对象数据成员的参数。例如,前面代码中,派生类对象数据成员所属类如果没有定义构造函数,或没有定义带参数的构造函数,则派生类deriver的构造函数可写成:


如果基类和对象数据成员的构造函数都无参数,派生类构造函数形参表中将只包含用于初始化他自己的基本类型数据成员的参数。
系统在建立派生类对象时,首先调用基类的构造函数,再调用其内嵌子对象的构造函数,然后系统才调用派生类的构造函数。如果是多继承,系统调用基类构造函数的顺序是按照定义派生类时这些基类被继承的顺序进行的,与这些基类构造函数在派生类构造函数成员初始化列表的先后次序无关。如果派生类有多个对象数据成员,则系统调用这些对象数据成员的构造函数的顺序是依据派生类定义这些成员的顺序进行的,与派生类成员初始化列表中对象数据成员构造函数排列先后次序无关。
派生类对象消亡时,系统先调用派生类析构函数,再调用其对象数据成员的析构函数,最后调用基类的析构函数。
5.继承同名成员处理方式
问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?
1.访问子类同名成员  直接访问即可
2.访问父类同名成员,需要加作用域




总结:1.子类对象可以直接访问到子类中同名成员
2.子类对象加作用域可以访问到父类同名成员
3.当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数
6.同名静态成员处理
问题:继承中同名的静态成员在子类对象上如何进行访问?
静态成员和非静态成员出现同名,处理方式一致
1.访问子类同名成员,直接访问即可
2.访问父类同名成员,需要加作用域



6.多继承中的二义性与虚函数

在基类base的成员,要被继承到派生类Fderiver1和Fderiver2,然后又被继承到派生类Sderiver.则在派生类Sderiver中,基类base的成员有两份拷贝,因此通过派生类Sderiver的对象访问基类base的公有成员时,编译系统就不知道应该如何从两份拷贝中进行选取,也就是出现二义性问题。
C++提供了虚基类的方法,使得在继承间接共同基类时只保留一份成员。在定义第一级派生类时用关键字virtual修饰说明继承关系,其语法形式为
class 派生类:virtual 继承方式 基类名
{
//...
};
在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同,只对紧随其后的基类起作用。





在包含虚基类是继承结构中,系统在建立派生类对象时,调用构造函数的顺序如下:
1.按照虚拟基类被继承的顺序,调用它们的构造函数
2.按照非虚拟基类被继承的顺序,调用它们的构造函数“
3.按照对象数据成员声明都顺序,调用它们的构造函数。
4.执行派生类自己的构造函数


 








 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一下 C++ 继承派生的相关知识,并且给您一个定义 Employee 类的示例代码。 在 C++ 继承是一种重要的面向对象编程技术,它允许我们在一个类的基础上定义另一个类。被继承的类称为基类或父类,继承的类称为派生类或子类。派生类可以继承父类的成员变量和成员函数,并且还可以添加自己的成员变量和成员函数。 下面是一个定义 Employee 类的示例代码: ```c++ // Employee 类的定义 class Employee { public: Employee(string name, int age, string gender, double salary); virtual ~Employee(); virtual void display() const; protected: string name_; int age_; string gender_; double salary_; }; // Manager 类的定义,它是 Employee 类的派生类 class Manager : public Employee { public: Manager(string name, int age, string gender, double salary, string department); virtual ~Manager(); virtual void display() const; private: string department_; }; ``` 在上面的代码,Employee 类包含了一些基本的成员变量和成员函数,如姓名、年龄、性别和薪水,以及一个虚函数 display()。Manager 类是 Employee 类的派生类,它继承了 Employee 类的所有成员变量和成员函数,并且添加了一个部门名称的成员变量 department_ 和一个重载了 display() 函数的成员函数。 请注意,Employee 类的析构函数和 display() 函数都是虚函数,这是因为我们希望在派生类重载这些函数时能够正确地调用它们。 以上是一个简单的继承派生示例,希望能够帮助您更好地了解 C++ 的面向对象编程技术。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值