?教学目的与要求:
了解与继承有关的综合应用程序设计 。
掌握赋值兼容规则 。
教学内容提要:
1,赋值兼容规则;
2,应用举例;
教学重点:赋值兼容规则 。
教学难点:综合应用程序设计 。
教学进度,P148~P157
教学过程:
第 15 讲 赋值兼容规则和应用举例
( 1)可以用派生类的对象给基类对象赋值;
比如,class A{...};
class B:public A{void fun() {...}};
A a;B b;
a =b; //将对象 b中所含类 A成员的值赋给对象 a
( 2)可以用派生类的对象初始化基类对象的引用;
比如,B b; //类 A、类 B的意义同上
A &a=b; //用派生类对象初始化基类对象的引用
( 3)可以用派生类对象的地址给基类对象的指针赋值。
比如,B b; //类 A、类 B的意义同上
A *pa =&b; //用派生类对象的地址初始化基类对象的指针赋值兼容规则 是指在公有派生条件下,任何可以使用基类对象的地方都可以用其派生类的对象替代。
具体的赋值规则如下:
说明:赋值的结果是将派生类对象中所含基类成员的值赋给基类对象中相同的成员。
15.1 赋值兼容原则 】
第 2,3种方法建立的基类对象的引用和指针,只能用来访问派生类对象中从基类继承下来的成员 。如果需要用它们来访问派生类中新增的成员,就必须对它们进行 强制类型转换 。
比如,利用指针 pa访问类 B对象中的一个成员函数 fun(),
就需要采用下述语句,(B*)pa->fun();
#include<iostream.h>
class A;
void fun(A *p);
class A
{
public:
void display(){cout<<″调用类 A的函数 ″<<endl;}
int x;
};
class B:public A
{
赋值兼容原则举例例 15-1
public:
void display(){cout<<″调用类 B的函数 ″<<endl;}
int y;
};
class C,public B
{
public:
void display(){cout<<″调用类 C的函数 ″<<endl;}
};
void main()
{
A a;
B b;
C c;
c.x=1;
c.y=2;
a=c;
b=c;
(续)
cout<<″a.x=″<<a.x<<″\ tb.y=″<<b.y<<endl;
b.x=10;
b.y=20;
a=b;
cout<<″a.x=″<<a.x<<″\ tb.y=″<<b.y<<endl;
A *ap;
ap=&a;
fun(ap);
ap=&b;
fun(ap);
ap=&c;
fun(ap);
}
void fun(A *p)
{
p->display();
}
a.x=1 b.y=2
a.x=10 b.y=20
调用类 A的函数调用类 A的函数调用类 A的函数
(续)
15.2.1 派生类使用例 -- 公司雇员档案的管理假设公司雇员分为:雇员 (employee)、经理 (manager)、工程师 (engineer)、高级主管 (director)。而且假定只关心这几类雇员各自的如下一些数据:
employee(雇员 )类,姓名、年龄、工资;
manager(经理 )类,姓名、年龄、工资、行政级别;
engineer(工程师 )类,姓名、年龄、工资、专业、学位;
director(高级主管 )类:姓名、年龄、工资、专业、学位、职务。
【 15.2 应用举例 】
#include <iostream.h>
#include <string.h>
class employee { //employee类 (类型 ),将作为其它几个类的基类
short age;
float salary;
protected:
char * name;
public:
employee (short ag,float sa,char * na){
age=ag;
salary=sa;
name=new char[strlen(na)+1];
strcpy(name,na);
}
void print () const{
cout<<" "<<name<<",";
cout<<age<<",";
cout<<salary<<endl;
}
~employee() {delete[ ]name;}
};
class manager:public employee { //派生类
int level;
public:
manager(short ag,float sa,char* na,int lev)
:employee (ag,sa,na)
{ //对基类初始化负责
level=lev;
}
void print()const
{
employee::print(); //调用基类 print显示“共性”数据
cout <<" level:"<<level<<endl;
}
};
/*注意:允许派生类中的 print与基类的 print重名,按如下规定进行处理:对子类而言,不加类名限定时默认为是处理子类成员,而要访问父类重名成员时,则要通过类名限定 */
class engineer:public employee
{
char speciality,adegree;
public:
...
};
enum ptitle {PS,GM,VPS,VGM};
class director:public engineer {
ptitle post;
public:
...
};
director(short ag,float sa,char*na,char sp,char ad,ptitle p)
:engineer(ag,sa,na,sp,ad)
{
post=p;
}
void print()
{ engineer::print();
cout<<“:”<<post<<endl;
}
void main() { //主函数
employee emp1(23,610.5,"zhang"),
emp2(27,824.75,"zhao");
manager man1(32,812.45,"li",11),
man2(34,1200.5,"cui",7);
engineer eng(26,1420.10,"meng",'E','M');
director dir(38,1800.2,"zhou",’C’,’D’,GM);
emp1.print();
emp2.print();
man1.print();
man2.employee::print(); //调用基类的 print
eng.print();
dir.print();
}
15.2.2 P161 4.13
person
teacher student
stud
score
name
id
degree
dep
old
sno
math
eng
addr
tel
#include <iostream.h>
#include <string.h>
class person
{
char *name;
int id;
public:
person (int i,char * na)
{
name=new char[strlen(na)+1];
strcpy(name,na);
id=i;
}
void print () const
{
cout<<“id:”<<id<<“name:,<<name<<<<endl;
}
~person() {delete[ ]name;}
};
class tercher:public person { //派生类
char degree,*dep;
public:
teacher(int i,char*na,char deg,char*d),person (i,na)
{ //对基类初始化负责
degree =deg;
dep=new char[strlen(d)+1];
strcpy(dep,d);
}
void print()const
{
person::print(); //调用基类 print显示“共性”数据
cout <<" degree:"<<degree<<“dep:”<<dep<<endl;
}
~teacher() {delete[ ]dep;}
};
class student:public person { //派生类
char* sno;
int old;
public:
student(int i,char*na,int o,char*s),person (i,na)
{ //对基类初始化负责
old =o;
sno=new char[strlen(s)+1];
strcpy(sno,s);
}
void print()const
{ person::print(); //调用基类 print显示“共性”数据
cout <<" sno:"<<sno<<“old:”<<old<<endl;
}
~student() {delete[ ]sno;}
};
class stud
{
char *addr,*tel;
public:
stud( char * ad,char *t)
{
addr=new char[strlen(ad)+1];
strcpy(addr,ad);
tel=new char[strlen(t)+1];
strcpy(tel,t);
}
void print () const
{
cout<<“addr:”<<addr<<“tel:,<<tel<<endl;
}
~stud() {
delete[ ]addr;
delete[]tel;}
};
class score:public student,public stud{ //派生类
int math,eng;
public:
score(int i,char*na,char *s,int o,char *ad,char*t,int m,int e)
:student (i,na,o,s),stud(ad,t)
{ //对基类初始化负责
math=m;
eng=e;
}
void print()const
{
student::print(); //调用基类 print显示“共性”数据
stud::print();
cout <<" math:"<<math<<“eng:”<<eng<<endl;
}
};
void main()
{
char*n,*d,dep,*ad,*t,*s;
int i,o,m,e;
cin>>n>>ad>>t>>s;
cin>>i>>o>>m>>e;
score c1(i,na,s,o,ad,t,m,e);
c1.print();
cin>>n>>i>>deg>>d;
teacher t1(i,na,deg,d);
t1.print();
}
小结
1、赋值兼容规则(基类对象、指针、引用的赋值)
2、与继承有关的程序设计(派生类的定义方法)
作业:
P159 4.12