个人的读书笔记,记录一下~
C++程序设计第四版·谭浩强·第12章C++的多态性
C++的多态性
1多态性是什么
向不同的对象发送同一个消息,不同的对象在接受时会产生不同的行为(即方法)。
2利用虚函数实现动态多态性
-
定义:基类声明的函数是虚拟的,不是实际存在的函数,在派生类中才正式定义此函数。
-
作用:允许在派生类中重新定义与基类同名的函数,可以通过基类指针或引用来访问基类和派生类中的同名函数。
-
对于基类(Point)与派生类(Circle)中的同名函数(display):
Circle c;c.display();
调用的是Circle中的displayPoint *p=&c;p->display;
调用的是Point中的display
-
使用:在基类Point中声明display函数时:把基类函数声明为虚函数(只用在声明里面生命清楚就好)
virtual void display();
像上面3中第二点,
Point *p=&c;p->display;
调用的是Circle派生类中的display -
使用虚函数会有一定的空间开销
虚析构函数
-
Point* p = new Circle;delete p;
这种情况只会调用基类Point的析构函数。当把基类析构函数声明为虚函数时,基类和派生类的析构函数都会被调用。
-
构造函数不能声明为虚函数。
-
静态关联:在编译时即可确定其调用的虚函数属于哪一个类,例如函数重载和通过对象名调用的虚函数。由于是在运行前进行关联的,又称为早期关联。
动态关联:编译系统把他放在运行阶段进行处理,在运行阶段确定关联关系。也叫滞后关联。
3纯虚函数
- 意义:基类的函数在基类中没有意义(只是为了派生,在派生类中定义),可以把该函数声明为纯虚函数。
- 基类中声明:
virtual float area() const=0;
没有函数体。 - 如果派生类中没有对纯虚函数的定义,则在派生函数中该函数仍然是一个纯虚函数。
- 纯虚函数无法被调用,包含纯虚函数的类无法创造对象,包含纯虚函数的类是抽象类。
4抽象类
- 意义:不用来定义对象而值作为一种基本类型用作继承的类叫做抽象类。定义这些类的唯一目的时用它作为基类去建立派生类。
- 可以定义指向抽象类数据的指针变量。这样的话可以用这种指针指向派生类对象,然后通过该指针调用虚函数,实现多态性的操作。