标签:
一、虚函数
在同一类中是不能定义两个名字相同、参数个数和类型都相同的函数的,否则就是“重复定义”。但是在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。而虚函数的作用,就是让我们在基类和派生类中调用同名函数。
在程序中不是通过不同的对象名去调用不同派生层次中的同名函数,而是通过指针调用它们。
举个例子:
假如我们定义了一个基类Shape
class Shape { public: void area();
Shape()=default;
Shape(int x,int y,int z):wid(x),len(y),rad(z) {}
~Shape()=default; private: int wid,len,rad; }
其中area函数用于计算面积,比如说矩形和圆,那么接下来我们就需要定义两个派生类Circle,Rectangle。但是由于基类中的area函数需要调用的是Shape中的三个私有元素。在派生类中无法调用,那么每次调用时,就得在派生类中给其另外赋值。
可是,如果将area定义为虚函数,那么在每个派生类中则可以重载,并且自定义其功能。
class Shape { public: virtual double area()=0; //define abstract class and virtual funtion Shape() { wid = len = rad = 0; } Shape(int a, int b, int c) :wid(a), len(b), rad(c) {} ~Shape() = default; protected: int wid, len, rad; };
class Rectangle :public Shape { public: Rectangle() { wid = len = 0; } Rectangle(int a, int b) :wid(a), len(b) {} virtual double area() { return wid*len; } protected: int wid, len, rad; };
class Circle :public Shape { public: Circle() { rad = 0; } Circle(int a) :rad(a) {} virtual double area(){ return (double)Pi*rad*rad; } protected: int rad; };
...
Rectangle A(wid, len); Rectangle *p = &A; //define a pointer,dynamic cout << "The area is:" <<p->area(); Circle C(rad); Circle *p = &C; cout << "The square is:" << p->area();
二、抽象类
什么是抽象类?个人简单理解,就是在类中含有纯虚函数。
例如上面例子中,类Shape中定义了纯虚函数:virtual double area()=0;
总结:
标签:
原文地址:http://www.cnblogs.com/hugongai/p/5837842.html