纯虚函数

virtual void GetRes()=0;
//virtual 返回值类型 函数名 (参数) = 0;

这样就是一个纯虚函数,你看上面的父类,GetRes函数是一个虚函数,它之前是return 0;

可是也要写出来,但是你写出来也压根就没用上过,所以可以直接定义为纯虚函数

在c++中,当一个类有纯虚函数了,这个类也称为抽象类

抽象类特点

1.抽象类是不可以实例化对象的,你做一个很抽象的东西,实例化是没有意义的,栈区和堆区都不允许实例化

2.如果写了一个抽象类,那么他的子类必须重写抽象类的纯虚函数,否则子类也属于抽象类

    class Base{
     piblic:
        void func() = 0; //纯虚函数,这称为了一个抽象类
    }
class Son:public Base{
 //这个子类什么也不写   
}
int main(){

    Base b;  //这里报错了,抽象函数不允许实例化(栈上创建不可行)
    new Base; //堆区创建也一样报错
    Son s; //一样报错,因为子类没有重写父类的纯虚函数,所以子类也是一个抽象类
}

如果你创建了一个抽象类,但是又不去重写这个纯虚函数,那么你创建的这个多态是一点意义都没有的.

所以子类必须重写父类的纯虚函数

class Base{
    public:
    virtual void func() = 0;
}

class Son:public Base {
 public:
    void func(){};  //重写纯虚函数,即使这个函数我什么都不写
}

int main(){
 Son s;  //这里也不报错,只要我重写了纯虚函数就不会报错,即使这个重写的函数里面什么也没有   
}

既然学会了,那么久要使用,我们使用多态的技术来进行调用,多态的技术是什么呢? 那是使用指针调用

这样哪怕你再来一个子类,比如Son2 我们也可以很方便的用指针来调用它,不过记得要在堆区new对象,用完还要记得delete释放掉.

class Base{
    public:
    virtual void func() = 0;
}

class Son:public Base{
    public:
    void func(){
        cout << "我是Son里的func函数"<<endl;
    }

}

class Son2:public Base{
 public:
    void func(){
     cout << "我是Son2里的func函数"<<endl;   
    }
}

int main(){
    Base *p = new Son;  //多态技术 用一个父类指针指向子类对象
    p->func();
    delete p;
    p = new Son2;
    p->func();
    delete p;
    //随意new一个子类指向他,并且随意调用,记得释放

}

也可以模板化这样操作,更为方便简洁,虽然初期可能绕一点点

class Base{
    public:
    virtual void func() = 0;
}

class Son:public Base{
    public:
    void func(){
        cout << "我是Son里的func函数"<<endl;
    }

}

class Son2:public Base{
 public:
    void func(){
     cout << "我是Son2里的func函数"<<endl;   
    }
}

void DoWork(Base *p){  //额外创建一个用于调用的函数
    p->func();
    delete p;
}
int main(){
    Dowork(new Son);  //直接把new的对象作为参数传给额外创建的函数,函数内用完就会delete堆区数据
    Dowork(new Son2); //这样岂不是更方便

}

以后如果需要添加新的功能,也不必去修改这些代码,只需要新增一个子类即可

记得 父类创建抽象类,设立纯虚函数,子类重写该函数

最后修改:2022 年 12 月 05 日
如果觉得我的文章对你有用,请随意赞赏