多恋
多态
主要内容 ■多态的实现类型 联编的概念 静态联编和动态联编的区别 虚函数的声明
◼ 多态的实现类型 ◼ 联编的概念 ◼ 静态联编和动态联编的区别 ◼ 虚函数的声明 主要内容
■由乐器类 Instrumen派生出管乐器类Wind、铉乐器类 Stringed、打击乐器类 Percussion 请给出图中各类的定义,根据定义编写一个关于奏乐 的程序。 Instrument playo Wind Stringed Percussion playo playo playo
Instrument play() Wind play() Stringed play() Percussion play() ◼ 由乐器类Instrument派生出管乐器类Wind、铉乐器类 Stringed、打击乐器类Percussion。 ◼ 请给出图中各类的定义,根据定义编写一个关于奏乐 的程序
Instrument类的定义: class Instrument public void playo i cout<< instrument play<<endl Wind类的定义: class Wind: public Instrument public void play()∥改写基类的 Playa函数 i cout<< wind play?<<endl;
Instrument类的定义: class Instrument { }; public: void play() { cout<<“instrument play”<<endl; } Wind类的定义: class Wind:public Instrument { }; public: void play() //改写基类的play()函数 { cout<<“wind play”<<endl; }
Stringed类的定义: class Stringed: public Instrument public void playo /改写基类的 Iplay(函数 i cout<< stringed play'<<endl; Percussion类的定义: class percussion public Instrument public void play0改写基类的 playO函数 i cout<< percussion play <<endl; j
Stringed类的定义: class Stringed:public Instrument { }; public: void play() //改写基类的play()函数 { cout<<“stringed play”<<endl; } Percussion类的定义: class Percussion:public Instrument { }; public: void play() //改写基类的play()函数 { cout<<“percunssion play”<<endl; }
void tune( Wind i)/管乐器奏乐 iplay void tune( Stringed i)/铉乐器奏乐 i. playo void tune( Percussion i)/打击乐器奏乐 playo
void tune(Wind i) //管乐器奏乐 { } i.play(); …… void tune(Stringed i) //铉乐器奏乐 { } i. play(); …… void tune(Percussion i) //打击乐器奏乐 { } i. play(); ……
void main( void tune( wind i) Wind flute i playo Stringed violin Percussion drum void tune(Stringed i) tune(flute) tune(violin) playo tune(drum) void tune(Percussion i) 如果增加乐器种类,则 同样的代码要重复多次 i playo; 只有参数不同!
void main() { } Wind flute; Stringed violin; Percussion drum; tune(flute); tune(violin); tune(drum); 如果增加乐器种类,则 同样的代码要重复多次, 只有参数不同! void tune(Wind i) { } i.play(); void tune(Stringed i) { } i. play(); void tune(Percussion i) { } i.play(); …… …… ……
改进1: void tune( nstrument&i)/向上转型 class Instrument payO-际{ void play( i cout<< instrument play?< <endl; void maino Wind flute Stringed violin class Wind Percussion drum, tune(flute) 希望 void playo tune(violin) i cout<<Wind play<<endl;) tune(drum)
改进1: void tune(Instrument& i) //向上转型 { } i.play(); …… void main() { } Wind flute; Stringed violin; Percussion drum; tune(drum); tune (flute); tune (violin); class Wind { }; …… void play() { cout<<“Wind play”<<endl; } 希望 class Instrument { }; …… void play() { cout<<“instrument play”<<endl; } 实际
改进2:(在向上转型基础上) void tune( nstrument&i)/向上转型 ●。●● .playo class instrument public virtual void play()∥虚函数 i cout<<instrument play '<<endl; j
改进2:(在向上转型基础上) void tune(Instrument& i) //向上转型 { } i.play(); …… { }; public: virtual void play() //虚函数 { cout<<“instrument play”<<endl; } class Instrument
class Wind: public Instrument public vitual void play)∥ virtual可省略 i cout<< wind play <<endl; class Percussion public Instrument publIc virtual void play/ virtual可省略 i cout<< percussion play?<<endl
class Wind:public Instrument { }; public: vitual void play() //virtual可省略 { cout<<“wind play”<<endl; } class Percussion:public Instrument { }; public: virtual void play //virtual可省略 { cout<<“percunssion play”<<endl; }