C语言大学教程 C++语言第21章.ppt
文本预览下载声明
⑤ 区别静态关联和动态关联。 ⑥ 如果在基类声明了虚函数,则在派生类中凡是与该函数有相同的函数名、函数类型、参数个数和类型的函数,均为虚函数(不论在派生类中是否用virtual声明)。 ⑦ 使用虚函数提高了程序的可扩充性。 关键字dynamic_cast(动态强制转换):操作符dynamic_cast将一个指向基类的指针转换为一个指向派生类的指针(如果不能正确转换,则返回0——空指针)。在类层次间进行上行转换时. class Shape { ??? public: virtual ~Shape(); ??? virtual void draw() const = 0; }; class Rollable { ??? public: virtual ~Rollable(); ??? virtual void roll() = 0; }; class Circle : public Shape, public Rollable { ??? void draw() const; ??? void roll(); }; class Square : public Shape { ??? void draw() const; }; ? //横向转型失败 Shape *pShape1 = new Square(); Rollable *pRollable1 = dynamic_castRollable*(pShape1); //pRollable为NULL //横向转型成功 Shape *pShape2 = new Circle(); Rollable *pRollable2 = dynamic_castRollable*(pShape2); //pRollable不为NULL 实例练习 设计shape类层次结构。每个TwoDShape类都包含成员函数getArea,用于计算二维形状的面积。每个ThreeDShape类都包含成员函数getArea和getVolume,分别用于计算三维形状的表面积和体积。编写一个程序,使用一个Shape指针的vector对象,他的元素指向类层次总每个具体类的对象。 1.程序打印输出该vector对象的所有形状循环中,程序应判断每个形状是二维形状还是三维形状,如果是二维形状,显示面积,如果是三维形状,显示表面积和体积。 * * * * * * In class base In class base In class B In class base In class base Delete []Bptr Delete [] Aptr Delete []baseptr Delete []Bptr Delete [] Aptr Delete []baseptr * * * //主函数 int main() { Student stud1(1001,″Li″,87.5); Graduate grad1(2001,″Wang″,98.5,563.5); Student *pt=stud1; //定义指向基类对象的指针变量pt pt-display( ); pt=grad1; pt-display( ); return 0; } num:1001 (stud1的数据) name:Li score:87.5 num:2001 (grad1中基类部分的数据) name:wang score:98.5 pay=1200 (这一项以前是没有的) 由虚函数实现的动态多态性就是: 同一类族中不同类的对象,对同一函数调用作出不同的响应。虚函数的使用方法是: ① 在基类用virtual声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。在类外定义虚函数时,不必加virtual。 ② 在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。 C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此在派生类重新声明该虚函数时,可以加virtual,也可以不加,一般在每一层声明该函数时都加virtual,使程序更加清晰。 如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。 ③ 定义一个
显示全部