继承的基础知识2——多重继承
来源:互联网 发布:晨曦计算式数据没了 编辑:程序博客网 时间:2024/05/20 17:42
一、一些基本该类
1、概念:派生类是继承两个或者两个以上的基类而生成的,这一过程叫做多重继承。多重继承的派生类中的成员大大的扩充了。
2、定义格式:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,......
3、例子:学会定义和使用基类实现多重继承
/**********************************************时间:2016年10月4日09:23:53功能:学会多重继承的基本概念,理清父类和子类构造 函数和析构函数的执行顺序。***********************************************/#include <iostream>using namespace std;class Father //定义基类1{public:Father(char *pf); //构造函数~Father(); //析构函数void fprint(); //成员函数private:char fname[10];};//函数的实现Father::Father(char *pf) //构造函数的实现{strcpy(fname,pf);cout<<"in father constructor"<<endl;}Father::~Father() //析构函数的实现{cout<<"in father deconstructor"<<endl;}void Father::fprint() //成员函数的实现{cout<<fname<<endl;}class Mother //定义基类2{public:Mother(char *pm); //构造函数~Mother(); //析构函数void mprint(); //成员函数private:char mname[10];};//函数的实现Mother::Mother(char *pm) //构造函数的实现{strcpy(mname,pm);cout<<"in mother constructor"<<endl;}Mother::~Mother() //析构函数的实现{cout<<"in mother deconstructor"<<endl;}void Mother::mprint() //成员函数的实现{cout<<mname<<endl;}//多重继承产生派生类class Son : public Father,public Mother{public:Son(char *ps); //派生类构造函数~Son(); //派生类析构函数void sprint();private:char sname[10];};Son::Son(char *ps):Father("king"),Mother("hu") //***派生类构造函数的实现,因为在构造子类对象时,需要先构造父类对象(除非没有父类)。 { //因此需要在子类的构造函数中对父类进行初始化。 strcpy(sname,ps);cout<<"in son constructor"<<endl;}Son::~Son() //派生类析构函数的实现{cout<<"in son deconstrucror"<<endl;}void Son::sprint(){Father::fprint(); //可以调用基类中的公有成员Mother::mprint();cout<<sname<<endl;}void main(){Son s1("kim");s1.sprint();}
二、多重继承存在的问题和解决方法
1、多重继承存在的问题
(1)多重继承的模糊性:多个基类中存在相同的函数,派生类定义的对象在调用该函数时会产生二义性的问题。
(2)重复继承:举个简单的例子,fish和bird具有同一个基类animal,当fish和bird同时作为flyfish的基类的时候,flyfish将重复继承两次animal。
2、解决重复继承的方法:定义虚基类,其作用是可以在继承的过程中只保留一份基类成员,这样就避免了重复继承而造成的二义性。
3、虚基类的声明格式:
class <派生类名>:virtual <继承方式> <基类名>
{
//派生类体
}
4、使用虚基类中应该注意的一些问题:
基类如果被多个派生类继承,那么派生类中只保留一份基类的成员。因为一个基类可以在生成一个派生类时作为虚基类,当生成另外一个类时可以不作为虚基类,这样 就保证了派生类中只保留一份基类的成员。
C++编译系统规定,如果所有直接派生类继承的都是虚基类,那么间接派生类就保留基类的成员,同时还要负责初始化基类的成员,这样就保证了在所有派生类中基类 只保留一份成员。应该将所有的直接派生类继承虚基类,从而避免产生二义性的问题。
5、例子:实现虚基类的继承方式,观察输出结果从而熟悉虚基类的使用方法。
- 继承的基础知识2——多重继承
- 老师—职工的多重继承
- c++远征之继承篇——多重继承,多继承,虚继承,多继承时的重复定义解决方法
- 继承的基础知识1——有关继承的基本概念
- 多重继承的基本概念
- 多重继承的优缺点
- C++的多重继承
- 多重继承的优缺点
- 多重继承的优缺点
- 多重继承的优缺点
- 类的多重继承
- C++的多重继承
- python的多重继承
- python的多重继承
- 多重继承的声明
- python的多重继承
- 多重继承的识别
- c++的多重继承
- 剑指offer-算法题练习:part16 链表中倒数第k个结点
- redis--持久化机制
- 有关项目框架转换快速定位程序中的问题
- 数据库事务
- https请求和http请求的转换
- 继承的基础知识2——多重继承
- 杭电 2018 母牛的故事【卡了很久的一题简单递归】
- 优美三角剖分(递归)
- thinkp 3.2框架 常量引用时,不起作用?
- spring AOP初步总结
- html的表单元素
- 网站压测工具Webbench源码分析
- typedef typename 理解
- spring+springmvc+ mybatis在sts tomcat8部署出现 严重: Context initialization failed java.lang.IllegalArgumen