第15讲赋值兼容规则和应用举例 教学目的与要求: 了解与继承有关的综合应用程序设计 掌握赋值兼容规则。 教学内容提要: 1、赋值兼容规则; 2、应用举例; 教学重点:赋值兼容规则。 教学难点:综合应用程序设计。 教学进度:P148P157 教学过程
•教学目的与要求: 了解与继承有关的综合应用程序设计。 掌握赋值兼容规则。 •教学内容提要: 1、 赋值兼容规则; 2、应用举例; •教学重点:赋值兼容规则。 •教学难点:综合应用程序设计。 •教学进度:P148~P157 •教学过程: 第 15 讲 赋值兼容规则和应用举例
15.1赋值兼容原则】 赋值兼容规则是指在公有派生条件下,任何可以使用基类对象 的地方都可以用其派生类的对象替代。 具体的赋值规则如下 (1)可以用派生类的对象给基类对象赋值 比如: class a} lass B: public A void funo o.3; Aa:bb: a /将对象b中所含类A成员的值赋给对象a 说明:赋值的结果是将派生类对象中所含基类成员的 值赋给基类对象中相同的成员。 (2)可以用派生类的对象初始化基类对象的引用; 比如:Bb; /类A、类B的意义同上 A&a=b;/)派生类对象初始化基类对象的引用 (3)可以用派生类对象的地址给基类对象的指针赋值 比如:Bb; 类A、类B的意义同上 Da=&b;∥用派生类对象的地址初始化基类对象的指针
(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对象中的一个成员函数fun0, 就需要采用下述语句:(B*)pa->fun0; 例15-1(赋值兼容原则举例 #includesiostream.h> class a: void fun(a*p); class a public: void display{cout<<"调用类A的函数<<end;} int x: class B: public a
第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的函数"<<end;} int class C: public b public: void display{cout<<"调用类C的函数<<end} void main( Bb: C Cx=1; cab
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<<". x="<<a x<<tb. y=<<by<<endl; (续) b.x=10 by=20; cout<<"ax=<<.x<<"\tb. y="<<by<<endl A*ap p=&a; ax=1 by=2 fun(ap); ax=10by=20 ap=&b 调用类A的函数 fun(ap); 调用类A的函数 p=& 调用类A的函数 fun(ap); void fun(a"p) p->display
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的函数 (续)