c++面向对象程序设计62.pptVIP

  • 1
  • 0
  • 约4.24千字
  • 约 16页
  • 2019-09-15 发布于山西
  • 举报
* 第6章 类的其它特性(多态性与虚函数) 纯虚函数 在基类中不对虚函数给出有意义的实现,它只是在派生类中有具体的意义。这时基类中的虚函数只是一个入口,具体的目的地由不同的派生类中的对象决定。这个虚函数称为纯虚函数。 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:public A{ //派生类 int z; public: C(){z=3000;} void print(){cout “z=”z‘\n’;}//重新定义纯虚函数 }; void main(void ) { A *pa; B b; C c; pa=b; pa-print(); pa=c; pa-print(); A a; pa=a; pa-print( ); } y=2000 z=3000 抽象类 不能定义抽象类的对象 1、在定义纯虚函数时,不能定义虚函数的实现部分。 2、把函数名赋于0,本质上是将指向函数体的指针值赋为初值0。与定义空函数不一样,空函数的函数体为空,即调用该函数时,不执行任何动作。在没有重新定义这种纯虚函数之前,是不能调用这种函数的。 3、把至少包含一个纯虚函数的类,称为抽象类。这种类只能作为派生类的基类,不能用来说明这种类的对象。 其理由是明显的:因为虚函数没有实现部分,所以不能产生对象。但可以定义指向抽象类的指针,即指向这种基类的指针。当用这种基类指针指向其派生类的对象时,必须在派生类中重载纯虚函数,否则会产生程序的运行错误。 4、在以抽象类作为基类的派生类中必须有纯虚函数的实现部分,即必须有重载纯虚函数的函数体。否则,这样的派生类也是不能产生对象的。 综上所述,可把纯虚函数归结为:抽象类的唯一用途是为派生类提供基类,纯虚函数的作用是作为派生类中的成员函数的基础,并实现动态多态性。 虚基类 多基派生中的多条路径具有公共基类时,在这条路径的汇合处就会因对公共基类产生多个拷贝而产生同名函数调用的二义性。 解决这个问题的办法就是把公共基类定义为虚基类,使由它派生的多条路径的汇聚处只产生一个拷贝。 class Base{ }; class A : public Base{ }; class B: public Base{ }; class C: public A, public B{ }; 类C中继承了两个类Base,即有两个类Base的实现部分,在调用时产生了二义性。 用虚基类进行多重派生时,若虚基类没有缺省的构造函数,则在每一个派生类的构造函数中都必须有对虚基类构造函数的调用 (且首先调用)。 由虚基类派生出的对象初始化时,直接调用虚基类的构造函数。因此,若将一个类定义为虚基类,则一定有正确的构造函数可供所有派生类调用。 class base{ public: virtual void a(){ couta() in base\n;} virtual void b(){ coutb() in base\n;} virtual void c(){ coutc() in base\n;} virtual void d(){ coutd() in base\n;} virtual void e(){ coute() in base\n;} virtual void f(){ coutf() in base\n;} }; class A:public base{ public: virtual void a(){ couta() in A\n;} virtual void b(){ coutb() in A\n;} virtual void f(){ coutf() in A\n;} }; class B:public base{ public: virtual void a(){ couta() in B\n;} virtual void c(){ coutc() in B\n;} }; class C:public A,public B{ public: virtual void a(){ couta() in C\n;} virtual void d(){ coutd(

文档评论(0)

1亿VIP精品文档

相关文档