java多重继承和多继承_多继承和多重继承
------------------siwuxie095
多继承 和 多重继承,两个词差别不大,但是差之毫厘、谬以千里 …
多重继承
如果有这样三个类:人类、士兵类、步兵类,其中:士兵类继承了人类,
步兵类继承了士兵类,这三个类之间的关系称之为多重继承
如果在继承时,这三个类都使用了 public 公有继承,那么它们也
存在着以下的关系:
士兵是一个人,步兵是一个士兵,步兵也是一个人
具体到代码上,可以这样来写:
多继承
如果有一个类,不仅继承了工人类,还继承了农民类,暂且把这个类
称之为 农民工类
即 一个子类同时有两个父类,或 一个派生类同时有两个基类,这样的
关系称之为多继承
多继承和多重继承是完全不同的,在多继承的关系下,如果农民工类
在继承工人类和农民类时,都以 public 公有继承的方式继承,那么
它们还存在着这样一种关系:
农民工是一个工人,农民工是一个农民,但工人和农民本身是平行的
具体到代码上,可以这样来写:
注意:写法上,中间要加逗号隔开,在继承每一个类时,都要将继承
方式写出来,如果不写,系统默认继承方式为 private 私有继承
程序 1:多重继承
Person.h:
#include
using namespacestd;
classPerson
{
public:
Person(string name = "Jim");
~Person();
voidplay();
protected:
string m_strName;
};
Person.cpp:
#include"Person.h"
#include
using namespacestd;
Person::Person(string name)
{
m_strName = name;
cout << "Person()"<< endl;
}
Person::~Person()
{
cout << "~Person()"<< endl;
}
voidPerson::play()
{
cout << "Person--play()"<< endl;
cout << m_strName << endl;
}
Soldier.h:
#include"Person.h"
classSoldier:publicPerson
{
public:
Soldier(string name = "James", intage = 20);
~Soldier();
voidwork();
protected:
intm_iAge;
};
Soldier.cpp:
#include"Soldier.h"
#include
using namespacestd;
Soldier::Soldier(string name, intage)
{
m_strName = name;
m_iAge = age;
cout << "Soldier()"<< endl;
}
Soldier::~Soldier()
{
cout << "~Soldier()"<< endl;
}
voidSoldier::work()
{
cout << "Soldier--work()"<< endl;
cout << m_strName << ","<< m_iAge << endl;
}
Infantry.h:
#include"Soldier.h"
classInfantry:publicSoldier
{
public:
Infantry(string name = "Jack", intage = 30);
~Infantry();
voidattack();
};
Infantry.cpp:
#include"Infantry.h"
#include
using namespacestd;
Infantry::Infantry(string name, intage)
{
m_strName = name;
m_iAge = age;
cout << "Ifantry()"<< endl;
}
Infantry::~Infantry()
{
cout << "~Infantry()"<< endl;
}
voidInfantry::attack()
{
cout << "Infantry--attack()"<< endl;
cout <
}
main.cpp:
#include
#include"Infantry.h"
#include
using namespacestd;
voidtest1(Person p)
{
p.play();
}
voidtest2(Person &p)
{
p.play();
}
voidtest3(Person *p)
{
p->play();
}
//无论继承的层级有多少,只要保持着直接或间接的继承关系,
//子类都可以与自己的直接父类或间接父类称为is-a关系
//并且能够通过指针对直接子类或间接子类的对象进行相应的操作
intmain(void)
{
Infantry infantry;
cout << endl;
infantry.play();
infantry.work();
infantry.attack();
cout << endl;
test1(infantry);
cout << endl;
test2(infantry);
cout << endl;
test3(&infantry);
system("pause");
return0;
}
运行一览:
程序 2:多继承
Farmer.h:
#include
using namespacestd;
classFarmer
{
public:
Farmer(string name = "Jack");
virtual~Farmer();//虚析构函数
voidsow();
protected:
string m_strName;
};
Farmer.cpp:
#include"Farmer.h"
#include
using namespacestd;
Farmer::Farmer(string name)
{
m_strName = name;
cout << "Farmer()"<< endl;
}
Farmer::~Farmer()
{
cout << "~Farmer()"<< endl;
}
voidFarmer::sow()
{
cout << "Farmer--sow()"<< endl;
cout << m_strName << endl;
}
Worker.h:
#include
using namespacestd;
classWorker
{
public:
Worker(string code = "001");
virtual~Worker();//虚析构函数
voidwork();
protected:
string m_strCode;
};
Worker.cpp:
#include"Worker.h"
#include
using namespacestd;
Worker::Worker(string code)
{
m_strCode = code;
cout << "Worker()"<< endl;
}
Worker::~Worker()
{
cout << "~Worker()"<< endl;
}
voidWorker::work()
{
cout << "Worker--work()"<< endl;
cout << m_strCode << endl;
}
MigrantWorker.h:
#include"Farmer.h"
#include"Worker.h"
classMigrantWorker :publicFarmer, publicWorker
{
public:
MigrantWorker(string name, string code);
virtual~MigrantWorker();
};
MigrantWorker.cpp:
#include"MigrantWorker.h"
#include
using namespacestd;
//使用初始化列表初始化
MigrantWorker::MigrantWorker(string name, string code) :Farmer(name), Worker(code)
{
cout << "MigrantWorker()"<< endl;
}
MigrantWorker::~MigrantWorker()
{
cout << "~MigrantWorker()"<< endl;
}
main.cpp:
#include
#include"MigrantWorker.h"
#include
using namespacestd;
intmain(void)
{
//从堆中实例化子类对象,先调用父类构造函数再调用子类构造函数
//调用父类构造函数的顺序和初始化列表中的顺序一样
//析构函数的调用顺序则相反
MigrantWorker *p = newMigrantWorker("Merry", "100");
cout << endl;
p->sow();
p->work();
cout << endl;
deletep;
p = NULL;
system("pause");
return0;
}
运行一览:
【made by siwuxie095】
java多重继承和多继承_多继承和多重继承相关推荐
- W6_面向对象_封装_继承_多继承_多态
W6_面向对象_封装_继承_多继承_多态 80.81.82.83.第02章节-Python3.5-面向对象介绍 84.第05章节-Python3.5-实例变量与类变量 85.第06章节-Python3 ...
- 注解默认继承_默认方法和多重继承
注解默认继承 最近卢卡斯JOOQ埃德尔发布和文章有关嵌套类及其使用. 这是一个有趣的话题,他的文章一如既往地有趣并且值得一读. 只有一个简短的声明我无法同意,我们有一个简短的回复链,导致了默认方法,以 ...
- C++_类和对象_C++继承_菱形继承_或钻石继承_问题及利用虚继承解决该问题---C++语言工作笔记068
然后我们再来看一下在c++继承中的,一个很好玩的内容, 菱形继承,又叫 钻石继承. 比如我们有个动物类,然后 羊继承了这个动物类,然后驼也继承了这个动物类, 然后,羊驼,通过多继承,继承了羊类和驼类, ...
- C++_类和对象_C++继承_继承的方式_公共继承_保护继承_私有继承---C++语言工作笔记062
然后我们再去看c++中的继承,现在我们来看,c++中继承的, 3种方式. 去看上面的图,可以看到,有公共继承,有保护继承,有私有继承.3种方式. 我们去写代码去看看.首先,我们写个Base1类, 然后 ...
- C++_类和对象_C++继承_多继承语法---C++语言工作笔记067
然后我们再去看一下c++中的多继承的语法 用来解决,比如,如果我一个子类,继承了父类1,也继承了父类2 ,如果 父类1,中有个变量A,父类2中也有个变量A,那么,子类,调用父类A变量的时候,如何区分, ...
- 【二十一】Python全栈之路--构造方法_继承_登录注册
文章目录 1. 构造方法__init__ 2. 单继承_多继承 2.1 单继承 2.2 多继承 3. super的深度理解 4. 注册_登录 4.1 注册 4.2 登录 5. 小练习 1. 构造方法_ ...
- Java继承_这10道Java面试题!大部分的人回答不出来
1.为什么等待和通知是在 Object 类而不是 Thread 中声明的? 2.为什么Java中不支持多重继承? 3.为什么Java不支持运算符重载? 4.为什么 String 在 Java 中是不可 ...
- 在java语言中 ()方法是不可以继承的_Java 语言中,构造方法是不可以继承的。( )_学小易找答案...
[简答题]需求分析完整话术 [简答题] [单选题]适用于场地面积有限,集装箱吞吐量较大的水陆联运码头的起重机系统是( )系统 [单选题]利用叉车或半挂车.汽车承载货物,连同车辆一起开上开下船,到达目的 ...
- java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super
目录点击跳转 包 包的命名方法 导入包中的类 系统包的介绍 **注意事项** 继承 基础知识 构造方法 **基础语法** `protected`修饰符 组合 `this`和`super`关键字 `th ...
最新文章
- 程序员该怎么做,才能成为coding王者?
- Python爬虫爬取部分学校的新闻标题、时间、对应的新闻链接
- VTK:几何对象之Frustum
- Oracle中的Round和Trunc
- 人群频率 | gnomAD数据库 (二) 后台数据的获取及质量评估
- ZZULOJ 1056:幸运数字
- 启动mysql失败:net start mysql服务名无效
- 【CSS3】 理解CSS3 transform中的Matrix(矩阵)
- 如何用程序实现对IE中scripts的控制(禁止和允许)
- sprintf函数、snprintf函数、asprintf函数、vsprintf
- 如何用四个简单的步骤加速 LibreOffice
- Java经典编程题50道之二十四
- c语言课程设计报告书通讯录,C语言课程设计学生通讯录管理系统设计
- matlab 滑动平均窗滤波,滑动平均滤波器与CIC滤波器
- Excel快速填充小技巧,这几个技能你会了吗
- 学计算机办公文员软件,办公文员必须掌握的办公软件有哪些
- 【论文阅读】Low-Resource Knowledge-Grounded Dialogue Generatio
- Joda-Time包基础应用
- “热榜第一”阿里年薪80W的Java架构师,到底是有着怎样的水平?
- kafka是什么?深刻理解kafka
热门文章
- jenkins前端运行,才能显示执行情况
- 企业微信PC版应用跳转到默认浏览器,避坑指南,欢迎补充。。。
- 梦境世界 - 2022-02-16
- Spring Cloud Config 客户端启动错误(Fetching config from server at : http://12)
- 查看Linux下文件和文件夹大小_莫枫恋_新浪博客
- 【编程题】已知树洞的数目、至少两只鸟进同一个树洞的概率,求鸟的数量
- 查找计算机硬件故障,怎么检查电脑硬件故障问题?
- 贝尔实验室创立 90 多年终于出了一本书,带你探秘未来网络
- linux扫描文本含有密码,Linux基础命令常用
- ​MegaUpload的Kim Dotcom展示了区块链文件共享平台K.im