纯虚函数
定义:
纯虚函数是一种特殊的虚函数。 在许多情况下, 在基类中不能对虚函数给出有意义的实现, 这时可以把它声明为纯虚函数, 它的实现留给该基类的派生类去做。
作用:
作为派生类中的成员函数的基础, 并实现多态性。
形式:
virtual 返回类型 函数名(形式参数列表) = 0;
抽象类
定义:
包含纯虚函数的基类称为抽象类。
注意:
- 一个抽象类只能作为基类来派生新类。 如果派生类中没有重新定义纯虚函数, 而只是继承基类的纯虚函数, 则这个派生类仍然是一个抽象类。 反之, 该派生类就不再是抽象类了, 而是可以建立对象的具体的类。
- 抽象类不能定义对象, 但可以定义指向抽象类的指针和引用。
- 抽象类不能用作参数类型、 函数返回类型或显式转换的类型。
#include<iostream>
using namespace std;
//抽象类,有2个纯虚函数
class Shape
{
public:
virtual double area() = 0;
virtual double volumn() = 0;
};
//派生类 正方体类
class Cube : public Shape
{
private:
float a_;
public:
Cube(float a = 0)
{
a_ = a;
}
~Cube(){}
virtual double area()
{
return a_ * a_ * 6;
}
virtual double volumn()
{
return a_ * a_ * a_;
}
};
//派生类 长方体类
class Cuboid : public Shape
{
private:
float a_;
float b_;
float h_;
public:
Cuboid(float a = 0, float b = 0, float h = 0)
{
a_ = a;
b_ = b;
h_ = h;
}
~Cuboid(){}
virtual double area()
{
return (a_ * b_ + a_ * h_ + b_ * h_) * 2;
}
virtual double volumn()
{
return a_ * b_ * h_;
}
};
void cal(Shape &s)
{
cout << "表面积为:" << s.area() << endl;
cout << "体积为:" << s.volumn() << endl;
}
int main()
{
//抽象类不能定义对象。
//Shape s;
Cube cube1(1.5);
Cuboid cuboid1(2, 1, 1.5);
//1.直接使用派生类对象去调用各自的成员方法
cout << "正方体cube1的表面积为:" << cube1.area() << endl;
cout << "正方体cube1的体积为:" << cube1.volumn() << endl;
cout << "长方体cuboid1的表面积为:" << cuboid1.area() << endl;
cout << "长方体cuboid1的体积为:" << cuboid1.volumn() << endl;
//使用多态的思想,通过实参的类型去判断调用的函数
cal(cube1);
cal(cuboid1);
return 0;
}