虚函数 多态性是OOP的关键技术之一。它指在一般 类中定义的操作在被继承类继承后可以有不同 的表现形式。 例如:图形的求面积 类: shape 操作:求面积 类:椭圆 类:长方形 操作:求面积操作:求面积 解决的方法:用虚函数实现动态联编 2021/224
2021/2/24 11 虚函数 多态性是OOP的关键技术之一。它指在一般 类中定义的操作在被继承类继承后可以有不同 的表现形式。 例如:图形的求面积 类:shape 操作:求面积 类:椭圆 操作:求面积 类:长方形 操作:求面积 解决的方法:用虚函数实现动态联编
例4:没有用多态性的例题 #includesiostream.h> class a public: 结果:AA void print(i cout <<"A class b: public a{/定义派生类 public void print(){cout<<"B";}};∥重新定义函数 void maino( a,p; Bb: p=&a;p→>prin();∥访问基类函数 p=&b;p->prin(;/希望访问派生类函数 2021/2/24
2021/2/24 12 例4:没有用多态性的例题 #include<iostream.h> class A { public: void print( ) { cout << "A "; } }; class B:public A { //定义派生类 public: void print( ) { cout << " B "; } }; //重新定义函数 void main( ) { A a, *p; B b; p= &a; p->print( ); //访问基类函数 p= &b; p->print( ); //希望访问派生类函数 } 结果:AA
虚函数的定义和使用 在基类中,在要被定义成虚函数的函数前加关键 字 virtual 例如: virtual void print(); 注意:1.关键字是 virtual 2.放在最前面,函数的类型不能忘, 如 virtual void print(;中的void 3.可只在基类中的函数加 virtual,在派生类 中不加,但为了便于阅读,可在所有要声明为虚函 数的前面都加 virtual 4.只需要在类定义文件,即头文件中的虚函 数加 virtual,在cpp文件中就不要再加 virtual 2021/224 13
2021/2/24 13 虚函数的定义和使用 在基类中,在要被定义成虚函数的函数前加关键 字 virtual 例如: virtual void print( ); 注意:1. 关键字是 virtual 2. 放在最前面,函数的类型不能忘, 如 virtual void print( );中的 void 3. 可只在基类中的函数加 virtual,在派生类 中不加,但为了便于阅读,可在所有要声明为虚函 数的前面都加 virtual 4. 只需要在类定义文件,即头文件中的虚函 数加virtual,在 cpp 文件中就不要再加 virtual
例5:用多态性解决例1中的问题。 #includesiostream.h> class base i public virtual void print( i cout<<“base”;}};∥定义了虚p class first: public base{∥定义派生类 public void print(){cout<<“ first”;}};∥重新定义 print() class second: public base{∥定义派生类 public: void print(){cout<" second";}};∥重新定义 print( 2021/224
2021/2/24 14 例5:用多态性解决例1中的问题。 #include<iostream.h> class base { public: virtual void print( ) { cout << “base ”; } }; //定义了虚函数 class first:public base { //定义派生类 public: void print( ) { cout << “ first ”; } }; //重新定义print( ) class second:public base { //定义派生类 public: void print( ) { cout << " second "; } }; //重新定义print( )
void maino i base ob1,*p;∥定义基类的对象 first ob2;/定义派生类的对象 second ob3;∥定义派生类的对象 p=&ob1;作指向基类对象ob1 p→ print();∥调用基类成员函数 p=&ob2;∥p指向子类对象ob2 p→ print();∥动态联编,调用子类成员函数 p=&ob3;∥/p指向子类对象ob3 p→ print();∥动态联编,调用子类成员函数 结果:base first second 2021/224 15
2021/2/24 15 void main( ) { base ob1, *p; //定义基类的对象 first ob2; //定义派生类的对象 second ob3; //定义派生类的对象 p= &ob1; //p 指向基类对象 ob1 p->print( ); // 调用基类成员函数 p= &ob2; // p 指向子类对象 ob2 p->print( ); // 动态联编, 调用子类成员函数 p= &ob3; // p 指向子类对象 ob3 p->print( ); // 动态联编, 调用子类成员函数 } 结果:base first second