C++编程入门(二) 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

纯虚函数

在一些情况下,父类不能给出虚函数的有意义的实现,这时就可以把虚函数说明为纯虚函数。纯虚函数不用在父类中实现,而是在子类中具体实现。例如,宠物类有个叫的函数,这个函数实现没有意义,宠物们没有统一的叫声啊。所以可以把“叫”这个函数在父类中说明为纯虚函数,而在子类中去实现这个函数。例如子类狗狗,“叫”的实现可以是输出“汪汪”;子类猫,“叫”的实现可以是输出“喵喵”。

关于纯虚函数要注意:

1. 是一种特殊的虚函数,是一种没有具体实现的虚函数。所以纯虚函数也有虚函数的特点,可以实现动态联遍。

2. 除了类的构造函数和析构函数不能调用纯虚函数外,其他函数都可以调用纯虚函数。

纯虚函数声明方式为:

class 类名{
    virtual 返回类型 函数名(参数列表)=0;
};

嘿嘿,就是在虚函数的声明方式后面加了"=0"

抽象类

包含纯虚函数的类就叫做抽象类。既然抽象类中有一个函数是没有实现的,所以这也就决定了抽象类的特点:

1. 不能说明抽象类的对象。抽象类只能用来派生其他类

2. 如果抽象类的子类里面,还没有这个纯虚函数的实现,那么这个子类也是一个抽象类。这个子类也只能去派生新类,不能声明对象。直到有一个类实现了纯虚函数,才能去声明这个类的对象。

\#include <iostream>
using namespace std;
class A
{
    public:
        virtual double Disp()=0;        //纯虚函数的声明
};
class B:public A
{
    public:
        B(double a){r=a;}        //构造函数
        //实现了纯虚函数
        virtual double Disp(){cout<<"r="<<r<<endl;}
    private:
        double r;
};
class C:public A
{
    public:
        C(double a){m=a;}        //构造函数
        //实现了纯虚函数
        virtual double Disp(){cout<<"m="<<m<<endl;}
    private:
        double m;
};
void func(Rectangle &rec)
{
    cout<<rrec.area()<<endl;
}
void main()
{
    //A r;        //不注释掉会报错
    B b(4);
    C c(5);
    func(b);
    func(c);
}

A类中定义了一个纯虚函数Disp,它没有实现,而是在子类B和子类C中实现。类A就是一个抽象类,在主函数中试图定义类A的对象是会报错。B类和C类实现了Disp,于是就不是抽象类了,可以声明B类和C类的对象。输出为:

r=4

m=5

从输出中可以看出,纯虚函数也可以进行动态联遍

在右侧代码框中编写程序:宠物类Pet,数据成员有age,sex,有一个纯虚函数bark(叫)。定义子类Dog和子类Cat,实现这个纯虚函数