青岛理工大学C++课件OOPC5-4
青岛理工大学课件.ppt
【例3-12】将字符数组str1中所有小写字母('a'~'z')转换成大写字母
#include <iostream.h> #include <string.h> inline int up_letter(char ch); void main( ) { char str[80]; int i;
cout<<"please input a string :"; cin>>str; for(i=0;i<strlen(str);i++)
3.1 函数的定义与申明
2、函数的申明
函数声明的语法形式
类型标识符 函数名(形式参数表) {
语句序列 }
是被初始化的内部 变量,寿命和可见 性仅限于函数内部
若无返回值,写void
形式参数表 <type1> name1, <type2> name2, ..., <typen> namen
函数的返回值 由 return 语句给出;无返回值的函数(void类型), 不必写return语句
类型说明 语句
}
类型说明符 函数名(形式参数表) 形式参数类型说明
{ 类型说明 语句
}
【例3-1】 max函数的位置示例
#include <iostream.h> int max(int a,int b) {
if(a>b)return a; else return b; } void main() { int max(int a,int b); int x,y,z; cout<<"input two numbers:"<<endl); cin>>x>>y; z=max(x,y); cout<<"maxmum= "<<z<<endl; }
青岛理工大学C++实验
青岛理工大学课程实验报告
算法描述及实验步骤(用适当的形式表达算法设计思想与算法实现步骤)实验步骤:
1:建立一个Win32 Console Application工程;
2:建立一个源文件(.cpp);
3:编写代码;
4:编译;
5:运行;
6:调试;
7:代码分析
调试过程及实验结果(详细记录在调试过程中出现的问题及解决方法。
记录实验执行的结果)P20. 6(1):求出1000以内的素数及素数的个数。
P20 6(3):编写一个程序输入年、月、日,打印出该天使那一年的第几天.
P21 .2: 编写一个函数,由实参传来一个字符串,统计此字符串中的字母,数字,空格和其他字符数。
P25 .1:设计一个立方体Box,他能计算并输出立方体的体积和表面积.
P26 .5
P33 .2: 改造实验内容1的CMoney类,把其中的4个构造函数整合为一个构造函数。
P34 .5: 运行程序,分析继承下构造函数的调用。
总结(对实验结果进行分析,问题回答,实验心得体会及改进意见。
字数必须在300-350字左右)
实验结果分析:P20. 6(1):素数只能整除1与它本身两个数,只要不输出(一个数整除1到它本身之间的数超过三个)的数即可,P20 6(3):用月份天数定义一个数组,输入年月日,数组前n(月)个数相加再加上天数就能得到为该年的第几天。
P21 .2:用getline()函数接收输入的字符串即可,再用ascll
注:实验报告一定要双面打印,模板中字体不能改动,填入的正文要求字体是小五号、宋体,行间距是单倍行距。
代码可以双行排列。
最新精美青岛理工大学毕业论文毕业设计答辩动态ppt模板
点击添加文字说明
论文描述科研成果的文章, 简称之为论文。它既是探 讨问题进行科学研究的一 种手段,精
Working Solutions
解决方案
点击添加文字说明
论文描述科研成果的文章,简称之为论 文。它既是探讨问题进行科学研究的一 种手段,
点击添加文字说明
论文描述科研成果的文章,简称之为论 文。它既是探讨问题进行科学研究的一 种手段,
点击添加文字说明
论文描述科研成果的文章,简称之为论 文。它既是探讨问题进行科学研究的一 种手段,
点击添加文字说明
论文描述科研成果的文章,简称之为论 文。它既是探讨问题进行科学研究的一
点击添加文字说明
论文描述科研成果的文章,简称之为论 文。它既是探讨问题进行科学研究的一
种手段,
种手段,
目 录
1 2 3 4 5
毕业论文(设计)答辩模板
Graduate Academic Report & Thesis Defense
名字
指导教师:
目 录
1 2 3 4 5
Contents
研究/选题背景 研究方法与思路
关键技术与实践难点 研究成果与应用 论文总结
研究/选题背景
Research Background
Research Background
Add your text here
点击添加文字
论文描述科研成果的文章,简称之为论
文。它既是探讨问题进行科学研究的一 种手段,又是描述科研成果进行学术交 流的一种工具。如学年论文、毕业论文、 学位论文、科技论文、成果论文等,总 称为论文。为了探讨和掌握论文的写作 规律和特点,需要对论文进行分类。由 于论文本身的内容和性质不同,研究领 域、对象、方法、表现方式不同,因此,
LC程序编写PPT演示文稿
M8002 S0
(启动)X0 S20
Y0
RST Y1 SET Y1
S100
T10 K30
X1
FNC40 S20 S100 (停止控制)
SET S0
X4 X0
M8040
当X4闭合后,激活M8040,状态被禁止转移。
只有按下启动按钮X0,切断M8040,状态才能 在执行完成后(用时间控制转移的状态,必须将按 钮按住至状态运行到设定值)进行转移。
•19
在规定时间内,由按钮的按下次数来确定不同的运行状态。
按钮 X0
S20
SET M0
INCP D0 [INC(FNC24)BIN加1。(D0)+1=D0]
M0
T1
(按钮按下时开始计算时间)
K20
T1 (LD= D0 K1 )
M10 (2s内,按钮按下1次就接通M10)
T1 (LD= D0 K2)
2、D1的编号要小于D2的编号。
3、D1、D2应同为16位数据或同为32位数据。
•21
M8002 S0 X0 S20
正常停止的实现
X1
FNC40 S20 S100 SET S0
Y0
注意:程序中若有置位的元件,停止时要同时将其复位。
M8002 S0 X0 S20
SET Y0
T10 T10
X3 X2 1
S0 S20 (单周期)(连续)
SB1
SB2 连续 单周期 K1 单步
X0 X1 X2 X3 X4 COM
Y0 Y1 Y2 Y3 Y4 COM
原点指示 运行指示
•15
用跳转指令控制自动与手动模式模式的运行
(自动控制)
X2
c教学日历罗容-设备
青岛理工大学教学周历表
2010 ~2011学年第二学期
专业:机械授课班级:设备101-4,热动102
教师所在院部:计算机工程学院
授课教师姓名、职称:罗容副教授
选用教材:C语言程序设计教程,张敏霞等编,电子工业出版社
主要参考书:C程序设计语言,刘瑞新等,机械工业出版社
教研室主任签字:教学院长(主任)签字:
2011 年3月8日
注:
1.讲授内容应紧紧围绕教学大纲的内容填写;
2.课程作业、习题课、实验、上机内容应与授课的章节相对应;
3.教学周历需打印两份,经教研室主任、教学院长(主任)审核签字后,分别留存学院(部)、教务处备查;
4.右上角方框内学时仅填写课内学时。
青岛理工大学C 实验上机实验报告(3)
a=i;b=j;c=l;
y=j;
}
}
private:
virtual void disp(){
double a,b,c;
cout<<"y= "<<y<<endl;
};
}
double triangle::area(){
private:
int y;
double p=(a+b+c)/2;
};int main()
double r;
3
v=0):hour(i),minute(j),second(v)
};
{}
double circle::area()
void get();
{
void display();
return r*r*PI;
Time (Time &);
}
Time operator + ( Time);
int main()
"<<minute<<" : "<<second<<endl;
class Triangle
}
{
Time Time::operator + (Time time)
public:
{
Triangle(double i=0.0,double j=0.0,double
Time t;
v=0.0):a(i),b(j),c(v)
else {
t.hour=hour+24-time.hour; } return t; }Int main() {Time time1,time2,time3; time1.get(); time2.get(); time3=time1+time2; cout<<"时间的加法结果: \n"; time3.display(); time3=time1-time
青岛理工大学C 实验上机实验报告(4)
return 0;
元素
}
{
二:#include<iostream>
int tag=0;
#include<iomanip>
if(head->next==NULL)
using namespace std;
{
template<typename T>
cout<<"对不起,你的链表为空.请你
4
class List { public: List() {
cout<<setw(4)<<p->data; p=p->next;
} cout<<endl; }
束):"<<endl; cin>>t; switch(t) { case 1: s.Insert(); break; case 2: cout<<"按元素删除请按 1,按位
置删除请按 2"<<endl; int choose,pos; cin>>choose; switch(choose) { case 1: s.Delete();break; case 2: cout<<"请输入你要删除
free(first);
{
}
if(!vis[i])
else
{ prime[c++]=i;
for(p=first;p->next;p=p->next)// 查 找 满足
if(c% 10)
p->next 指向要删除结点的 p
{
if(p->next->data==x)//删除结点
青岛理工大学ppt模板
点击此处添加标题
单击此处输入文本,单击此处输入文本,单击此处输入文本,单击 此处输入文本,单击此处输入文本,单击此处输入文本,单击此处 输入文本,单击此处输入文本,单击此处输入文本
选题背景
国内研究现状
单击此处输入文本,单击此处输入文 本,单击此处输入文本,单击此处输 入文本,单击此处输入文本,单击此 处输入文本,单击此处输入文本,单 击此处输入文本,单击此处输入文本 单击此处输入文本,单击此处输入文 本,单击此处输入文本,单击此处输 入文本,单击此处输入文本,单击此 处输入文本,单击此处输入文本,单 击此处输入文本,单击此处输入文本
研究意义
点击此处添加标题
单击此处输入文本,单击此处输入文 本,单击此处输入文本,单击此处输 入文本,单击此处输入文本,单击此 处输入文本
点击此处添加标题
单击此处输入文本,单击此处输入文
本,单击此处输入文本,单击此处输
入文本,单击此处输入文本,单击此
01 02 04 03
处输入文本
点击此处添加标题
单击此处输入文本,单击此处输入文 本,单击此处输入文本,单击此处输 入文本,单击此处输入文本,单击此 处输入文本
• 重点内容123 • 青岛理工大学青岛理工大学 589392青岛理工大学 • 青岛理工大学青岛理工大学青岛理工大学 852286
研究方法
1
2
在此输入您的文字内容,在此输入您的文字内容在此输 入您的文字内容,在此输入您的文字内容在此输入您的 文字内容 在此输入您的文字内容,在此输入您的文字内容在此输 入您的文字内容,在此输入您的文字内容在此输入您的 文字内容
国外研究现状
单击此处输入文本,单击此处输入文 本,单击此处输入文本,单击此处输 入文本,单击此处输入文本,单击此 处输入文本,单击此处输入文本,单 击此处输入文本,单击此处输入文本 单击此处输入文本,单击此处输入文 本,单击此处输入文本,单击此处输 入文本,单击此处输入文本,单击此 处输入文本,单击此处输入文本,单 击此处输入文本,单击此处输入文本
波司登杯青岛理工大学PPT大赛获奖作品联想--高海涛
别睡了,再 睡就下课了
是有理数 我又没让
你听我的
我去跳 房子
我去踢 足球
我去玩滑 板
我去……Biblioteka 下课去打 篮球童年时代的操场,总是如此 充满生机与活力
秋季是落叶归根的季节,我联 想到的是生命中的分离
兄弟,别 忘了我啊
别跟个女人 一样啰嗦, 鬼才会想你
兄弟,转眼又 要分离了,想 我了给我打个 电话
推着轮椅上的爸爸走在路上,蓦地发现爸爸原本庞大 的身影再也没能遮住我的身体。 爸爸笑了,我却哭了。
伴随着哭喊声,我们来到了这个 小时候,最喜欢的事是爸 爸陪我一起放风筝 陌生世界,认识了两个陌生的人
每次放学,奶奶都会很准 小时候家里穷,但每年生日妈妈 不忘给我做一碗热腾腾的长寿面 时的在村口等我回家吃饭
夏
夏季是热烈奔放的季节,我联 想到的是生命的狂放与 激 情
喂喂,√2 可老师说 是有理数还 哦,下课了 是无理数 叫我一声 是无理数啊 啊
奶奶再也没来等我回家吃饭了, 因为奶奶去了世界的另一边
冬季敲响了一年的尾声,正如人 之暮年,怀着对生命的美好回忆, 走完最后一程
冬
珍惜亲情,友情长存。 高海涛作品
我们哭喊着来到这个世界 在沉默中悄悄淡去 正如徐志摩在《再别康桥》中写道 悄悄的我走了, 正如我悄悄的来, 我挥一挥衣袖, ` 不带走一片云彩。 四季可以往复 生命却难以轮回 我们赤裸裸而来 终究空荡荡而归 那么 有谁会记得 这个世界,我们曾 一起走过……
注意
1、请务必使用微软office2007播放, 使用微软office2003或者WPS会出现 动画失效、颜色失真、动画声音不 同步的问题 2、 播放前请安装好同文件夹下的 字体 3、本ppt完全自动播放,开始放映 后无需继续操作。
山东理工大学史上最全C语言PPTC程序设计(14 文件)
【例】将例14.2中创建的number.txt文件中的若干个 整数成绩读取出来,并输出到显示器上。 问题分析: 当从文件中读出数据时,若未明确给出文件中数据 的个数,如何才能控制读出全部数据呢?
为此,在C语言中提供了一个测试函数feof,通过该 函数即可判断是否读完全部数据而到达文件末尾。 feof函数的原型为 int feof(FILE *fp); 其功能是判断fp所指向的文件是否到达文件末尾。若 是,则返回非0;否则,返回0。
main() {FILE *fp; fp=fopen("d:\\f01\\a1.txt","w"); if(fp==NULL) {printf("文件打开失败!\n"); exit(0); } fclose(fp); }
创建文本文件与二进制文件
一个新创建的文件是文本文件还是二进制文件的 决定因素,是向文件中写入数据的函数,而 不是文件的打开方式。
【例】从键盘上输入若干个学生成绩,以−99作 为结束标志,然后写入到C盘根目录中的文件 number.txt中。 算法设计: (1)以写方式打开文件number.txt; (2)输入一个学生成绩,并写入到文件 number.txt中; (3)循环执行第(2)步,直至输入−99为止; (4)关闭文件。
【例】从文件中读出所有数据。 #include<stdio.h> #include<stdlib.h> main() {FILE *fp; int x; if((fp=fopen("d:\\f01\\a1.txt","r"))==NULL) {printf("文件打开失败!\n"); exit(0);} while(1) {fscanf(fp,"%d",&x); if(feof(fp)!=0) break; printf("%d ",x);} fclose(fp);
最新青岛理工大学透明校徽可编辑ppt模板下载
相关理论及前沿成果 SECTION
相关理论前沿成果POWER TEMPLATE
60% 50% 40% 30% 20% 10%
60% 50% 40% 30% 20% 10%
0%
0%
点击此处添加标题
点击此处添加标题
论文具体内容的你论文具体内容的你论文具体内容的你论文具体内容的你论文具体内容的你论文具体内容的你论文具体内容的你论文具体内容的小。论文具 体内容的你论文具体内容的你论文具体内容的你论文具体内容的你论文具体内容的你论文具体内容的你论文具体内容的你论文具体内容的小。t. In nec lacus laoreet orci varius imperdiet sit amet in augue.
庞加莱猜想
哥德巴赫猜想
杨-米尔斯存在性和质量缺口
西姆松定理
尺规作图
NP完全问题
费马大定理
黎曼假设
论文具体内容的你论文具体内容的你论文具体内容的你 论文具体内容的你论文具体内容的你论文具体内 容的你论文具体内容的你论文具体内容的小。论 文具体内容的你论文具体内容的你论文具体内容 的你论文具体内容的你论文具体内容的你论文具 体内容的你论文具体内容的你论文具体内容的小 。t. In nec lacus laoreet orci varius imperdiet sit amet 论文具体内容的你论文具体内容的你论文具体内容的你 in augue. 论文具体内容的你论文具体内容的你论文具体内 容的你论文具体内容的你论文具体内容的小。论 文具体内容的你论文具体内容的你论文具体内容 的你论文具体内容的你论文具体内容的你论文具 体内容的你论文具体内容的你论文具体内容的小 。t. In nec lacus laoreet orci varius imperdiet sit amet 论文具体内容的你论文具体内容的你论文具体内容的 in augue. 你论文具体内容的你论文具体内容的你论文具体 内容的你论文具体内容的你论文具体内容的小。 论文具体内容的你论文具体内容的你论文具体内 容的你论文具体内容的你论文具体内容的你论文 具体内容的你论文具体内容的你论文具体内容的 小。t. In nec lacus laoreet orci varius imperdiet sit amet in augue.
C 面向对象程序设计 - 青岛理工大学
课程基本信息
课本: C++面向对象程序设计,李兰,任凤华等, 2014,
第二次印刷。
参考书籍: Bruce Eckel.Thinking in C++ (2nd Edition).北京: 机械工业出版社,2006.10 郑莉.C++语言程序设计(第3版).北京:清华大 学出版社,2005.7 谭浩强.C++面向对象程序设计.北京:清华大学出 版社,2006.1
【例1-4】用子函数和主函数编写程序实现例1-3的编程要求 int add(int a, int b) //定义add函数,函数值为整型 { int c; //定义一个整型变量 c=a+b; //计算两个数的和 return c; //将c的值返回,通过add带回调用处 }
编译运行该程序,屏幕上将出现与例1-3相同的提示, 当输入两个整型数(22和36)后,按回车键,同样可 得输出结果: x+y=58
对同类型对象抽象出其共性,形成类。
类通过一个简单的外部接口,与外界发生关系。 对象与对象之间通过消息进行通信
1.2 程序设计方法
3、面向对象程序设计方法
优点:
程序模块间的关系更为简单,程序模块的独立性、数 据的安全性就有了良好的保障。
通过继承与多态性,可以大大提高程序的可重用性,
使得软件的开发和维护都更为方便。
一个消息就是一个对象要求另一个对象实施某 种操作的一个请求。
1.3 面向对象程序设计的基本特点
4、继承
继承对于软件复用有着重要意义,是面向对象 技术能够提高软件开发效率的重要原因之一。
定义:特殊类的对象拥有其一般类的全部属性 与服务,称作特殊类对一般类的继承。 例如:将轮船作为一个一般类,客轮便是一个 特殊类。
青岛大学电气控制及plc学习课件
17
底板
CVM1
OMRON 公司的组合式 PLC
18
日本欧姆龙株式会社(OMRON)
(其前身“日本立石公司”,1990年更 名)
• 小型PLC CP CPM1A CPM2A CPM2C CPM2AH CPM2AH-S SRM2C • 中型PLC CJ2 CJ1M CJ1 CQM1 CQM1H C200Ha C200HE • 大型PLC CS1D CVM1 CVM1D CS1 CV500 CV1000 CV2000 19
1971年,日本研制出PLC DSC―8
1973年、1974年,西德、法国研制的PLC相继问世 1977年,我国也推出了以MC14500微处理器为核心的PLC
6
⑤伴随着大规模和超大规模微电子技术和计算机技术的迅猛发 展,起初的可编程逻辑控制器PLC,现如今不仅可以使用开 关量,而且也可以使用模拟量;不仅能进行逻辑控制,而且 也能进行数字控制、生产过程控制等,已真正成为一种电子 计算机工业控制装置。 • 1985年国际电工委员会(IEC)的定义:一种进行数字运算的 电子系统,专为工业环境下的应用而设计的工业控制器,采 用了可以编写程序的存储器,用来在其内部存储执行逻辑运 算、顺序控制、定时、计数和算术运算等操作的指令,并通 过数字或模拟式的输入和输出,控制各种类型机械的生产过 程。
52
七. PLC的编程语言
梯形图
功能块
语句表
结构文本 等
是“面向过程控制”的自然语言,易懂易学。
53
1. 梯形图编程语言
梯形图编程语言是一种图形语言,与继电器控制线路 相对应,形象、直观,是PLC的主要编程语言。( P21)
● 小型PLC体积减小、可靠性提高、成本下降。
计算机组成原理-青岛理工大学
R0 RN-1 Y …
存储 总线
地址线 数据线
CPU内部总线
Riin Ri Riout Yin
例1.通用寄存器之间传送数据
要把寄存器 R1 的内容 传送到寄存器R4,
(R1)→R4
暂存器 + ∧
Y
需要下列微操作:
R1out,R4in 有效
ALUin
ALU
Zin
ALU 控制
Zout
Z
暂存器
13
Riin Ri Riout Yin Y
例2.ALU完成算术逻辑运算 要将寄存器 R1 的内容与寄 存器R2的内容相加,结果送到 寄存器R3。 记作:(R1)+(R2)→R3
微操作序列如下: 第1步 (R1)→Y + ∧
ALUin
R1out,Yin有效
ALU 控制
ALU Zin
第2步(R2)+(Y)→Z 第3步 (Z)→R3 Zout,R3in有效
-
Zin
MDRin
Zout
Z
Zout,MDRin有效
MDRout
③ 1→W 假设MAR的内容没有改变,否则应同时有(R0)→MAR
18
2.转移指令JC disp 条件转移指令,根据PSWR的C位的状态决定是否转移。如 果有进位(C=1),就转移到目标地址,否则顺序执行下一条指 令。转移目标地址=PC的内容加指令中的位移量disp。
ALU→GR
指令译码器 ID
Reset CLK
imm/disp→ALU
通用寄存器组 PC+1 GR rs,rd→GR (rs1)→ALU ALU→PC (rs)→ALU +
启停 线路
CLK2
804青岛理工大学材料力学课件
§3.4 圆轴扭转时的应力
Me
pq
Me
_扭转角(rad)
pq p
q
d
a
d
c
a' O b
R
p
b′ q
dx
d _ dx微段两截面的
x
相对扭转角
边缘上a点的错动距离:
aa' Rd dx
边缘上a点的切应变:
R d
dx
发生在垂直于半径的平面内。
§3.4 圆轴扭转时的应力
p
q
d
ae
d
c
a ' e′O b
空心轴
则
令
Wt I p /(D / 2)
§3.4 圆轴扭转时的应力 实心轴与空心轴 I p 与 Wt 对比
Wt
Ip
/R
1
16
D3
Wt I p /(D / 2)
§3.4 圆轴扭转时的应力
扭转强度条件:
max
Tmax Wt
1. 等截面圆轴:
2. 阶梯形圆轴:
max
Tmax Wt
max
d 0.945
D
Wt 0.2 D 3 (1 4 ) 0.2 8.93 (1 0.9454 ) 29
max
T Wt
1930 29 106
66.7106 Pa
66.7MPa [ ] 70MPa
§3.4 圆轴扭转时的应力
例3.3 如把上例中的传动轴改为实心轴,要求 它与原来的空心轴强度相同,试确定其直径。 并比较实心轴和空心轴的重量。
§3. 2 外力偶矩的计算 扭矩和扭矩图
例题3.1 传动轴,已知转速 n=300r/min,主动轮A输入功率
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【例5-19】赋值兼容规则示例 19】 #include <iostream> using namespace std; class B0 //基类B0声明 {public: //公有成员函数 void display(){cout<<"B0::display()"<<endl;} }; class B1: public B0 { public: void display(){cout<<"B1::display()"<<endl;} }; class D1: public B1 { public: void display(){cout<<"D1::display()"<<endl;} };
class D:public B,public C //由基类B、C派生出类D { public: int d; D(int x,int y,int z,int m,int n):B(x,y),C(z,m){d=n;} void Print() { cout<<" B:: a="<<B::a<<'\t'<<"b="<<b<<endl; cout<<" C:: a="<<C::a<<'\t'<<"c="<<c<<endl; cout<<"d="<<d<<endl; } }; void main () { D d1(100,200,300,400,500); d1.Print(); }
【例5-18】定义虚基类,使派生类中只有基类的一个拷贝 18】定义虚基类, #include <iostream> using namespace std; class A { public: int a; A(int x=0 =0){a=x;} =0 }; class B: virtual public A { public: int b; B(int x,int y):A(x){b=y;} }; class C: virtual public A { public: int c; C(int x,int y):A(x) {c=y;} };
//由公共基类A派生出类B
//由公共基类A派生出类C
【例5-18】定义虚基类,使派生类中只有基类的一个拷贝 18】定义虚基类, class D:public B,public C //由基类B、C派生出类D { public: int d; D(int x,int y,int z,int m,int n):B(x,y),C(z,m){d=n;} void Print() { cout<<" B:: a="<<B::a<<'\t'<<"b="<<b<<endl; cout<<" C:: a="<<C::a<<'\t'<<"c="<<c<<endl; cout<<"d="<<d<<endl; } }; void main () { D d1(100,200,300,400,500); d1.Print(); d1.a=400; d1.Print(); }
5.6 赋值兼容规则
一个公有派生类的对象在使用上可以被当作基 类的对象,反之则禁止。具体表现在:
派生类的对象可以被赋值给基类对象。 派生类的对象可以初始化基类的引用。 指向基类的指针也可以指向派生类。
通过基类对象名、 通过基类对象名、指针只能使用从基类继承的 成员
Base objB; *pb=&objD; &b=objD; Derived objD; ObjB=objD; ObjD=objB; //合法 //假设Derived已定义为Base的派生类 //合法 //非法
下面的访问是正确的: 下面的访问是正确的: C cobj; cobj.b; B B1 C B2
b1
B1类成员
B2类成员 b2 d b B类成员
C类对象
GetWeight() Furniture SetWeight() Weight
GetWeight() Furniture SetWeight() Weight
Sleep()
Bed Weight
WatchTV() Sofa Weight
FoldOut() SleeperSofa
GetWeight() Furniture SetWeight() Weight
Sleep()
Bed Weight
WatchTV() Sofa Weight
FoldOut() SleeperSofa
void fun(B0 *ptr) {ptr->display(); //"对象指针->成员名" } void main() //主函数 { B0 b0; //声明B0类对象 B1 b1; //声明B1类对象 D1 d1; //声明D1类对象 B0 *p; //声明B0类指针 p=&b0; //B0类指针指向B0类对象 fun(p); p=&b1; //B0类指针指向B1类对象 fun(p); p=&d1; //B0类指针指向D1类对象 fun(p); }
class derived2:public base2, virtual public base1 { public: derived2() {cout<<"constructing derived2"<<endl;} }; class public derived1, virtual public derived2 { public: Derived3(){cout<<"constructing derived3"<<endl;} }; int main() { Derived3 obj; return 0; }
定义虚基类,使派生类中只有基类的一个拷贝。 例5-18 定义虚基类,使派生类中只有基类的一个拷贝。P194
#include <iostream> using namespace std; class A { public: int x; A(int a=0) {x=a; } // A() {x=0;} }; class B: virtual public A { public: int y; B(int a,int b):A(b) {y=a; } };
class C: virtual public A { public: int z; C(int a, int b):A(b) { z=a; } }; class D: public B, public C { public: int m; D(int a,int b,int d,int e,int f): B(a,b),C(d,e) {m=f;} void print() { cout<<"x="<<x<<'\t'<<"y="<<y<<endl; cout<<"x="<<x<<'\t'<<"z="<<z<<endl; cout<<"m="<<m<<endl; } };
对于虚基类而言,由于最远派生类对象中只有一个 公共虚基类子对象,为了初始化该公共基类子对象, 最远派生类的构造函数要调用该公共基类的构造函 数,而且只能被调用一次。
【例】有虚基类时,多继承方式下构造函数的调用顺序举例 #include <iostream> using namespace std; class base1 { public: base1() {cout<<"constructing base1"<<endl;} }; class base2 { public: base2(){cout<<"constructing base2 "<<endl;} }; class derived1:public base2, virtual public base1 { public: derived1() {cout<<"constructing derived1"<<endl;} };
int main() { D d1(100,200,300,400,500); d1.print (); d1.x=400; d1.print(); return 0; }
5.5 虚基类—举例
class class class class B{ private: int b;}; B1 : virtual public B { private: int b1;}; B2 : virtual public B { private: int b2;}; C : public B1, public B2{ private: float d;}
5.5 虚基类—构造函数
建立对象时所指定的类称为最(远)派生类。 虚基类的成员是由最远派生类的构造函数通过 调用虚基类的构造函数进行初始化的。 在整个继承结构中,直接或间接继承虚基类的 所有派生类,都必须在构造函数的成员初始化 表中给出对虚基类的构造函数的调用。如果未 列出,则表示调用该虚基类的默认构造函数。 在建立对象时,只有最远派生类的构造函数调 用虚基类的构造函数,该派生类的其他基类对 虚基类构造函数的调用被忽略。