C++中的虚函数(virtual)是可以被子类重写的成员函数
而纯虚函数(pure virtual)是必须被抽象/基类中的定义的虚函数,必须被派生类实现
virtual type function(){} //虚函数
virtual void funtion1()=0 // 纯虚函数
主要区别:
-
实现
虚函数有实现,而纯虚函数没有实现
子类中虚函数可以不重写,继承基类;而纯虚函数必须在子类中实现。 -
类
拥有一个以上纯虚函数的类为抽象类,不可以直接实例化对象
而拥有虚函数的的类不会强制为抽象类,可以实例化 -
调用
直接调用纯虚函数会导致链接错误
而虚函数可以被调用(派生类重写虚函数,则调用派生类的实现)
例子
- 虚函数
#include <iostream>
using namespace std;
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
virtual int area() //虚函数
{
cout << "Parent class area :" <<endl;
return 0;
}
};
class Rectangle: public Shape{
public:
Rectangle( int a=0, int b=0):Shape(a, b) { }
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height);
}
};
class Triangle: public Shape{
public:
Triangle( int a=0, int b=0):Shape(a, b) { }
int area ()
{
cout << "Triangle class area :" <<endl;
return (width * height / 2);
}
};
// 程序的主函数
int main( )
{
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);
// 存储矩形的地址
shape = &rec;
// 调用矩形的求面积函数 area
shape->area();
// 存储三角形的地址
shape = &tri;
// 调用三角形的求面积函数 area
shape->area();
return 0;
}
- 纯虚函数
#include <iostream>
using namespace std;
// 基类
class Shape
{
public:
// 提供接口框架的纯虚函数
virtual int getArea() = 0;
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// 派生类
class Rectangle: public Shape
{
public:
int getArea()
{
return (width * height);
}
};
class Triangle: public Shape
{
public:
int getArea()
{
return (width * height)/2;
}
};
int main(void)
{
Rectangle Rect;
Triangle Tri;
Rect.setWidth(5);
Rect.setHeight(7);
// 输出对象的面积
cout << "Total Rectangle area: " << Rect.getArea() << endl;
Tri.setWidth(5);
Tri.setHeight(7);
// 输出对象的面积
cout << "Total Triangle area: " << Tri.getArea() << endl;
return 0;
}
Ref
- https://www.runoob.com/cplusplus/cpp-polymorphism.html
- https://www.cnblogs.com/dijkstra2003/p/17254053.html