------------------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多重继承和多继承_多继承和多重继承相关推荐

  1. W6_面向对象_封装_继承_多继承_多态

    W6_面向对象_封装_继承_多继承_多态 80.81.82.83.第02章节-Python3.5-面向对象介绍 84.第05章节-Python3.5-实例变量与类变量 85.第06章节-Python3 ...

  2. 注解默认继承_默认方法和多重继承

    注解默认继承 最近卢卡斯JOOQ埃德尔发布和文章有关嵌套类及其使用. 这是一个有趣的话题,他的文章一如既往地有趣并且值得一读. 只有一个简短的声明我无法同意,我们有一个简短的回复链,导致了默认方法,以 ...

  3. C++_类和对象_C++继承_菱形继承_或钻石继承_问题及利用虚继承解决该问题---C++语言工作笔记068

    然后我们再来看一下在c++继承中的,一个很好玩的内容, 菱形继承,又叫 钻石继承. 比如我们有个动物类,然后 羊继承了这个动物类,然后驼也继承了这个动物类, 然后,羊驼,通过多继承,继承了羊类和驼类, ...

  4. C++_类和对象_C++继承_继承的方式_公共继承_保护继承_私有继承---C++语言工作笔记062

    然后我们再去看c++中的继承,现在我们来看,c++中继承的, 3种方式. 去看上面的图,可以看到,有公共继承,有保护继承,有私有继承.3种方式. 我们去写代码去看看.首先,我们写个Base1类, 然后 ...

  5. C++_类和对象_C++继承_多继承语法---C++语言工作笔记067

    然后我们再去看一下c++中的多继承的语法 用来解决,比如,如果我一个子类,继承了父类1,也继承了父类2 ,如果 父类1,中有个变量A,父类2中也有个变量A,那么,子类,调用父类A变量的时候,如何区分, ...

  6. 【二十一】Python全栈之路--构造方法_继承_登录注册

    文章目录 1. 构造方法__init__ 2. 单继承_多继承 2.1 单继承 2.2 多继承 3. super的深度理解 4. 注册_登录 4.1 注册 4.2 登录 5. 小练习 1. 构造方法_ ...

  7. Java继承_这10道Java面试题!大部分的人回答不出来

    1.为什么等待和通知是在 Object 类而不是 Thread 中声明的? 2.为什么Java中不支持多重继承? 3.为什么Java不支持运算符重载? 4.为什么 String 在 Java 中是不可 ...

  8. 在java语言中 ()方法是不可以继承的_Java 语言中,构造方法是不可以继承的。( )_学小易找答案...

    [简答题]需求分析完整话术 [简答题] [单选题]适用于场地面积有限,集装箱吞吐量较大的水陆联运码头的起重机系统是( )系统 [单选题]利用叉车或半挂车.汽车承载货物,连同车辆一起开上开下船,到达目的 ...

  9. java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super

    目录点击跳转 包 包的命名方法 导入包中的类 系统包的介绍 **注意事项** 继承 基础知识 构造方法 **基础语法** `protected`修饰符 组合 `this`和`super`关键字 `th ...

最新文章

  1. 程序员该怎么做,才能成为coding王者?
  2. Python爬虫爬取部分学校的新闻标题、时间、对应的新闻链接
  3. VTK:几何对象之Frustum
  4. Oracle中的Round和Trunc
  5. 人群频率 | gnomAD数据库 (二) 后台数据的获取及质量评估
  6. ZZULOJ 1056:幸运数字
  7. 启动mysql失败:net start mysql服务名无效
  8. 【CSS3】 理解CSS3 transform中的Matrix(矩阵)
  9. 如何用程序实现对IE中scripts的控制(禁止和允许)
  10. sprintf函数、snprintf函数、asprintf函数、vsprintf
  11. 如何用四个简单的步骤加速 LibreOffice
  12. Java经典编程题50道之二十四
  13. c语言课程设计报告书通讯录,C语言课程设计学生通讯录管理系统设计
  14. matlab 滑动平均窗滤波,滑动平均滤波器与CIC滤波器
  15. Excel快速填充小技巧,这几个技能你会了吗
  16. 学计算机办公文员软件,办公文员必须掌握的办公软件有哪些
  17. 【论文阅读】Low-Resource Knowledge-Grounded Dialogue Generatio
  18. Joda-Time包基础应用
  19. “热榜第一”阿里年薪80W的Java架构师,到底是有着怎样的水平?
  20. kafka是什么?深刻理解kafka

热门文章

  1. jenkins前端运行,才能显示执行情况
  2. 企业微信PC版应用跳转到默认浏览器,避坑指南,欢迎补充。。。
  3. 梦境世界 - 2022-02-16
  4. Spring Cloud Config 客户端启动错误(Fetching config from server at : http://12)
  5. 查看Linux下文件和文件夹大小_莫枫恋_新浪博客
  6. 【编程题】已知树洞的数目、至少两只鸟进同一个树洞的概率,求鸟的数量
  7. 查找计算机硬件故障,怎么检查电脑硬件故障问题?
  8. 贝尔实验室创立 90 多年终于出了一本书,带你探秘未来网络
  9. linux扫描文本含有密码,Linux基础命令常用
  10. ​MegaUpload的Kim Dotcom展示了区块链文件共享平台K.im