虚函数的使用限制派生类中的虚函数重定义时,函数名、返回类型,参数表要与基类虚函数完全一样例:class Cat:public Pet( public:void speak(int n) cout<<"miao!miao!"<<endl; )3;Pet *p1;/基类对象指针p1Cat cat1;p1=&cat1;用Cat类对象地址给基类指针赋值调用的还是基类的speak()函数p1->speak();I怀不合法p1->speak(1);15
15 二、虚函数的使用限制 4、派生类中的虚函数重定义时,函数名、返回类型,参数表 要与基类虚函数完全一样 例:class Cat : public Pet { public: void speak(int n) { cout<< "miao!miao!"<<endl; } }; Pet *p1; //基类对象指针p1 Cat cat1; p1 = &cat1; //用Cat类对象地址给基类指针赋值 p1->speak(); //调用的还是基类的speak()函数 p1->speak(1); //不合法
12.4抽象类类是从相似对象抽取共性得到的抽象数据类型1抽象类只能被其他类作为基类继承,而不能实例化为任何对象的类,也称为抽象基类3具体类含义更加明确的类,能够建立实例化的对象。4、抽象类的唯一用途:为其他类提供合适的基类,其他类可以从这里继承和实现接口。16
16 12.4 抽象类 1、类是从相似对象抽取共性得到的抽象数据类型。 2、抽象类只能被其他类作为基类继承,而不能实例化为 任何对象的类,也称为抽象基类。 3、具体类含义更加明确的类,能够建立实例化的对象。 4、抽象类的唯一用途:为其他类提供合适的基类,其他 类可以从这里继承和实现接口
12.4抽象类具体类和抽象类的作用:从软件用户角度,软件只需要用到一些具体事物的类;从软件设计者的角度,增加一个抽象的基类,可以提高代码重用率。注意:当基类的抽象化程度提高后,某些成员函数在基类中的实现变得没有意义,但声明仍有意义例如:例12-1中,Speak()函数的声明实现了多态性,但是在Pet类中的具体实现并没有实际意义,因为没人知道抽象的宠物如何发声解决方案可以将这类成员函数在基类中只做声明,以实现多态性,而将具体17买现留给派生类,即利用纯虚函数将基类改造为抽象类
17 12.4 抽象类 具体类和抽象类的作用: 从软件用户角度,软件只需要用到一些具体事物的类; 从软件设计者的角度,增加一个抽象的基类,可以提 高代码重用率。 注意:当基类的抽象化程度提高后,某些成员函数在基类中的实 现变得没有意义,但声明仍有意义。 例如:例12-1中,Speak( )函数的声明实现了多态性,但是在Pet类中的具 体实现并没有实际意义,因为没人知道抽象的宠物如何发声。 解决方案: 可以将这类成员函数在基类中只做声明,以实现多态性,而将具体 实现留给派生类,即利用纯虚函数将基类改造为抽象类
12.4抽象类纯虚函数(1)是指没有在基类中定义的虚函数(只声明,不定义函数体)(2)月虚函数的具体实现依赖于不同的派生类(3)定义纯虚函数的一般格式为:virtual返回类型函数名(参数表)=0;纯虚函数没有实现部分,仅仅为了实现多态性而存在,派生类必须给出自己的定义覆盖纯虚函数18
18 12.4 抽象类 1、纯虚函数 (1)是指没有在基类中定义的虚函数 (只声明,不定义函数体) (2)虚函数的具体实现依赖于不同的派生类。 (3)定义纯虚函数的一般格式为: virtual 返回类型 函数名(参数表)=0; 纯虚函数没有实现部分,仅仅为了实现多态性而存在,派生 类必须给出自己的定义覆盖纯虚函数