C++面向对象程序设计谭浩强第十二章.ppt
文本预览下载声明
虚函数的访问 用基指针访问与用对象名访问 用基指针访问虚函数时,指向其实际派生类对象重新定义的函数。实现动态聚束。 通过一个对象名访问时,只能静态聚束。即由编译器在编译的时候决定调用哪个函数。 class Point{ float x,y; public: Point(){} Point(float i,float j){ x=i; y=j; } virtual float area(void) { return 0.0; }//声明为虚函数 }; const float Pi=3.14159; class Circle:public Point{ //类Point的派生类 float radius; public: Circle(float r){ radius=r; } float area(void) { return Pi*radius*radius;}//虚函数再定义 }; void main(void) { Point *pp; //基类指针,可以将派生类对象的地址赋给基类指针 Circle c(5.4321); coutc.area()endl; coutc.Point::area()endl; coutc.Circle::area ()endl; } 输出:92.7011 0 92.7011 可见,利用对象名进行调用与一般非虚函数没有区别。 用对象名调用area( ) class base0{ public: void v(void){ coutbase0\n; } }; class base1:public base0{ public: virtual void v(void){ coutbase1\n; } }; class A1:public base1{ public: void v(){ coutA1\n; } }; class A2:public A1{ public: void v(void){ coutA2\n; } }; class B1:private base1{ public: void v(void){ coutB1\n; } }; class B2:public B1{ public: void v(void){ coutB2\n; } }; void main(void) { base0 *pb; A1 a1; (pb=a1)-v(); A2 a2; (pb=a2)-v(); B1 b1; (pb=b1)-v(); B2 b2; (pb=b2)-v(); } base0 base0 私有派生,在类外不能调用基类函数 class base0{ public: void v(void){ coutbase0\n; } }; class base1:public base0{ public: virtual void v(void){ coutbase1\n; } }; class A1:public base1{ public: void v(){ coutA1\n; } }; class A2:public A1{ public: void v(void){ coutA2\n; } }; class B1:private base1{ public: void v(void){ coutB1\n; } }; class B2:public B1{ public: void v(void){ coutB2\n; } }; void main(void) { base1 *pb; A1 a1; (pb=a1)-v(); A2 a2; (pb=a2)-v(); } A1 A2 纯虚函数 在基类中不对虚函数给出有意义的实现,它只是在派生类中有具体的意义。这时基类中的虚函数只是一个入口,具体的目的地由不同的派生类中的对象决定。这个虚函数称为纯虚函数。 class 基类名 { virtual 类型函数名(参数表)=0; ...... }; class A{ protected: int x; public: A(){x =1000;} virtual void print()=0; //定义纯虚函数 }; class B:public A{ //派生类 private: int y; public: B(){ y=2000;} void print(){cout “y=”y‘\n’;}//重新定义纯虚函数 }; class C:pub
显示全部