3.9 C++多继承
参考:http://www.weixueyuan.net/view/6366.html
总结:
C++中一个派生类中允许有两个及以上的基类,我们称这种情况为多继承
使用多继承可以描述事物之间的组合关系,但是如此一来也可能会增加命名冲突的可能性,冲突可能很有可能发生在基类与基类之间,基类与派生类之间。命名冲突是必须要解决的问题。
为了解决命名冲突问题我们只能采用域解析操作符来区分具体所调用的类中的成员函数。
在前面所有的例子中,派生类都只有一个基类,我们成这种情况为单继承。而在C++中一个派生类中允许有两个及以上的基类,我们称这种情况为多继承。单继承中派生类是对基类的特例化,例如前面中编程类书籍是书籍中的特例。而多继承中,派生类是所有基类的一种组合。
例1:
class teacher
{
public:
void settitle(char *a){title = a;}
char * gettitle(){return title;}
private:
char * title; //职称
}; class cadre
{
public:
void setpost(char *a){post = a;}
char * getpost(){return post;}
private:
char *post; //职务
}; class teacher_cadre: public cadre, public teacher
{
public:
void setwages(int a){wages = a;}
int getwages(){return wages;}
private:
int wages; //工资
};
在本例中我们定义了三个类,一个是教师类,该类中有一个成员变量职称title;另一个类是干部类,这个类中有一个成员变量职务post;最后定义了一个类teacher_cadre,这个类是cadre和teacher类的派生类,它也有一个新增的成员变量wages,表示工资。很明显教职工干部teacher_cadre类是cadre类和teacher类的组合。
在多继承中,派生类继承了所有基类中的所有成员变量和成员函数,这些继承过来的成员变量及成员函数其访问规则与单继承是相同的,下面我们将例1中的teacher_cadre类中的所有成员及访问属性列于下表中。
成员 | 属性 | 来源 |
---|---|---|
title | 不可访问 | teacher类 |
settitle | public | teacher类 |
gettitle | public | teacher类 |
post | 不可访问 | cadre类 |
setpost | public | cadre类 |
getpost | public | cadre类 |
wages | private | teacher_cadre类新增 |
setwages | public | teacher_cadre类新增 |
getwages | public | teacher_cadre类新增 |
使用多继承可以描述事物之间的组合关系,但是如此一来也可能会增加命名冲突的可能性,冲突可能很有可能发生在基类与基类之间,基类与派生类之间。命名冲突是必须要解决的问题。
例2:
#include <iostream>
using namespace std; class A
{
public:
void setx(int a){x = a;}
int getx(){return x;}
private:
int x;
}; class B
{
public:
void setx(int a){x = a;}
int getx(){return x;}
private:
int x;
}; class C: public A, public B
{
public:
void setx(int a){x = a;}
int getx(){return x;}
private:
int x;
}; int main()
{
C test;
test.setx();
test.B::setx();
test.A::setx();
return ;
}
这个例子是一个非常极端的例子,只是为了说明命名冲突问题。我们来看一下例子,在本例中有三个类A、B和C,其中C类继承自类A和类B。在三个类中我们都有一个成员变量,变量名恰好都为x,然后成员函数都名为setx和getx。由于两个基类和派生类中出现了命名冲突,因此产生了遮蔽的情况。为了解决命名冲突问题我们只能采用域解析操作符来区分具体所调用的类中的成员函数。
3.9 C++多继承的更多相关文章
- javaScript的原型继承与多态性
1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...
- JavaScript的继承实现方式
1.使用call或apply方法,将父对象的构造函数绑定在子对象上 function A(){ this.name = 'json'; } function B(){ A.call(this); } ...
- javascript中的继承与深度拷贝
前言 本篇适合前端新人,下面开始...... 对于前端新手来说(比如博主),每当对js的对象做操作时,都是一种痛苦,原因就是在于对象的赋值是引用的传递,并非值的传递,虽然看上去后者赋值给了前者,他们就 ...
- 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- JS继承类相关试题
题目一: //有关于原型继承的代码如下:function Person(name) { this.name = name;}Person.prototype = { getName : f ...
- JS继承之寄生类继承
原型式继承 其原理就是借助原型,可以基于已有的对象创建新对象.节省了创建自定义类型这一步(虽然觉得这样没什么意义). 模型 function object(o){ function W(){ } W. ...
- JS继承之借用构造函数继承和组合继承
根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...
- JS继承之原型继承
许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...
- 深入浅出JavaScript之原型链&继承
Javascript语言的继承机制,它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instanc ...
- 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型
前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.
随机推荐
- English trip M1 - PC6 Likes and Dislike Teacher:Jade
In this lesson you will learn to talk about likes and dislikes. 课上内容(Lesson) # 通常在习惯性的表达式用 it's 来表达w ...
- 20170922xlVBA_GetCellTextFromWordDocument
Sub GetCellTextFromWordDocument() '应用程序设置 Application.ScreenUpdating = False Application.DisplayAler ...
- 10 Node Frameworks to Use in 2019
原文 https://scotch.io/bar-talk/10-node-frameworks-to-use-in-2019 node Framworks列表: http://nodeframewo ...
- IOS, Android, Java Web Rest : RSA 加密和解密问题
IOS, Android, Java Web Rest : RSA 加密和解密问题 一对公钥私钥可以使用 OpenSSL创建, 通常 1024位长度够了. 注意: 1. 公钥私钥是BASE64编码的 ...
- css之transform属性
定义元素的旋转(rotate),缩放(scale),移动(translate),倾斜(skew) rotate rotate(angle) 定义 2D 旋转,在参数中规定角度. rotate3d(x, ...
- json -- dump load dumps loads 简单对比
json.dumps是将一个Python数据类型列表进行json格式的编码解析, 示例如下: >>> import json #导入python 中的json模块>>&g ...
- hdu 1025LIS思路同1257 二分求LIS
题目: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- H5 DeviceMotionEvent 事件制作“摇一摇效果”
摇一摇”的效果制作主要依赖于H5的deviceMotionEvent事件 先讲怎么使用,具体的原理在后边补充 第一步:捕捉重力加速度 var acceleration = eventData.acce ...
- acl使用示例
declare v_count number; uprinciple varchar2(20); principle varchar2(20); begin uprinciple := ...
- URL和URI的不同
URL是什么?有什么用? URL(统一资源定位符)是Internet上资源的地址,可以定义为引用地址的字符串,用于指示资源的位置以及用于访问它的协议. URL是在网络上定位资源的最普遍使用的方式,它提 ...