继承与派生例题分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

虚基类
#include<iostream.h> class A1 { public: A1(){cout<<"A1\ A1(){cout<<"A1\n";} }; class A2 { public: A2(){cout<<"A2\ A2(){cout<<"A2\n";} }; class B1:public A2,virtual public A1 { public: B1(){cout<<"B1\ B1(){cout<<"B1\n";} };
运行结果
The table properties are: Height=15 Area=12.5664 Color=1
多类继承中构造函数和析构函数的执 行顺序
定义一个圆桌类,该类具有桌子类和圆类的特性。 #include <iostream.h> enum Color {Red,Yellow,Green,White}; //圆类Circle的定义 //圆类Circle的定义 class Circle { float radius; public: Circle(float r){radius=r;cout<<“Circle initialized!"<<endl;} initialized! ~Circle(){cout<<"Circle destroyed!"<<endl;} float Area(){return 3.1416*radius*radius;} };
在程序的main函数中,创建派生类的对象bb, 在程序的main函数中,创建派生类的对象bb, 并初始化为(1 并初始化为(1,5,2)。 这时系统
– 调用基类的构造函数 – 调用基类子对象的构造函数 – 调用派生类的构造函数
多类继承
定义一个圆桌类,该类具有桌子类和圆类的特性。 #include <iostream.h> enum Color (Red,Yellow,Green,White); //圆类Circle的定义 //圆类Circle的定义 class Circle { float radius; public: Circle(float r){radius=r;} float Area(){return 3.1416*radius*radius;} };
Table initialized! initialized! Circle initialized! initialized! RoundTable initialized! The table properties are: Height=15 Area=12.5664 Color=1 RoundTable destroyed! Circle destroyed! Table destroyed!
举例1 举例1
void main() { B bb(1,2,5); bb.Print(); }
运行结果
调用A 调用A的有参构造函数! 调用A 调用A的有参构造函数! 调用B 调用B的有参构造函数! 1,5,2 调用B 调用B的默认析构函数! 调用A 调用A的默认析构函数! 调用A 调用A的默认析构函数!
继承与派生
派生类构造函数举例1 派生类构造函数举例1
#include<iostream.h> class A//定义基类A A//定义基类A { public: A() {a=0;cout<<"调用A的默认构造函数!\n";} {a=0;cout<<"调用A的默认构造函数!\ A(int i){a=i;cout<<"调用A的有参构造函数!\n";} i){a=i;cout<<"调用A的有参构造函数!\ ~A(){cout<<"调用A的默认析构函数!\ ~A(){cout<<"调用A的默认析构函数!\n";} void Print()const{cout<<a<<",";} int Geta(){return a;} private: int a; };
void main() { RoundTable cir_table(15.0,2.0,Yellow); cout<<"The table properties are:"<<endl; //调用Table类的成员函数 //调用Table类的成员函数 cout<<"Height="<<cir_table.Height()<<endl; //调用Circle类的成员函数 //调用Circle类的成员函数 cout<<"Area="<<cir_table.Area()<<endl; //调用RoundTable类的成员函数 //调用RoundTable类的成员函数 cout<<"Color="<<cir_table.GetColor()<<endl; }
//桌子类Table的定义 //桌子类Taheight; public: Table(float h){height=h;cout<<“Table initialized!"<<endl;} initialized! ~Table(){cout<<"Table destroyed!"<<endl;} float Height() { return height; } };
void main() { RoundTable cir_table(15.0,2.0,Yellow); cout<<"The table properties are:"<<endl; //调用Table类的成员函数 //调用Table类的成员函数 cout<<"Height="<<cir_table.Height()<<endl; //调用Circle类的成员函数 //调用Circle类的成员函数 cout<<"Area="<<cir_table.Area()<<endl; //调用RoundTable类的成员函数 //调用RoundTable类的成员函数 cout<<"Color="<<cir_table.GetColor()<<endl; }
//桌子类Table的定义 //桌子类Table的定义 class Table { float height; public: Table(float h){height=h;} float Height() { return height; } };
//圆桌类RoundTable的定义 //圆桌类RoundTable的定义 class RoundTable:public Table, public Circle { Color color; public: RoundTable(float h,float r,Color c); int GetColor(){return color;} }; RoundTable::RoundTable(float h,float r,Color c):Table(h),Circle(r) { color=c; }
举例1 举例1
B::B(int i,int j, int k):A(i),aa(j) { b=k; cout<<"调用B的有参构造函数!\ cout<<"调用B的有参构造函数!\n"; } void B::Print() { A::Print(); cout<<b<<","<<aa.Geta()<<endl; }
举例1 举例1
class B:public A { public: B() {b=0;cout<<"调用B的默认构造函数!\n";} {b=0;cout<<"调用B的默认构造函数!\ B(int i,int j,int k); ~B(){cout<<"调用B的默认析构函数!\ ~B(){cout<<"调用B的默认析构函数!\n";} void Print(); int Geta(){return a;} private: int b; A aa; };
A1 A2 B2 A2 B1 topB
class B2:public A2,virtual public A1 { public: B2(){cout<<"B2\ B2(){cout<<"B2\n";} }; class topB:public B1,virtual public B2 { public: topB(){cout<<"topB\ topB(){cout<<"topB\n";} }; void main(void) { topB obj; }
//圆桌类RoundTable的定义 //圆桌类RoundTable的定义 class RoundTable:public Table, public Circle { Color color; public: RoundTable(float h,float r,Color c); ~RoundTable(){cout<<"RoundTable destroyed!"<<endl;} int GetColor(){return color;} }; RoundTable::RoundTable(float h,float r,Color c):Table(h),Circle(r) { color=c; cout<<"RoundTable initialized!"<<endl; }
B是派生类构造函数名,它的总参数表中有三 个,参数i用来初始化基类的数据成员;参数j 个,参数i用来初始化基类的数据成员;参数j 用来初始化派生类中的子对象aa;参数k 用来初始化派生类中的子对象aa;参数k用来 初始化派生类B中的数据成员b 初始化派生类B中的数据成员b。冒号后面的 是成员初始化列表,如果表中有多项,必须 用逗号隔开。
相关文档
最新文档