• c++ 接口类


    什么是接口类?2017-06-07

    接口类就是只提供接口不提供实现的类,就是接口类,接口类和抽象类对C++而言,没有什么区别。

    接口类有如下特点:

    1. 子类来实现接口类中没有实现的所有接口。
    2. 接口方法前面有virtual关键词修饰,并且等于0。
    3. 只能被继承,不能独自生成对象。

    实现一个动物的接口类例子如下:

    #ifndef BASEINTERFACE_H
    #define BASEINTERFACE_H
    //用于动物的接口类
    class BaseInterface{
        //是动物都要吃东西,睡觉以及爱好
    public:
        virtual void Eat()=0;
        virtual void Sleep()=0;
        virtual void Hobby()=0;
    
        virtual ~BaseInterface(){}
    };
    
    #endif // BASEINTERFACE_H

    人类继承接口类

    #ifndef PERSON_H
    #define PERSON_H
    #include <QString>
    #include "baseinterface.h"
    //继承动物的接口类
    class Person : public BaseInterface
    {
    
    public:
        Person();
    //继承动物接口后一定要实现接口类中的接口
        void Eat();
        void Sleep();
        void Hobby();
    //但是人类作为动物有自己的行为和爱好
    private:
        QString personName;
    public:
        void Speak();
        void SetName(QString pName);
        QString GetName();
    };
    
    #endif // PERSON_H

    人类实现接口类方法:

    #include "person.h"
    #include <QDebug>
    Person::Person()
    {
        personName = "";
    }
    
    void Person::Eat(){
        qDebug()<<"eat bread";
    }
    void Person::Sleep(){
        qDebug()<<"Sleep 1 hour";
    }
    void Person::Hobby(){
        qDebug()<<"run 35 mins";
    }
    void Person::Speak(){
        qDebug()<<"person speak a lot of language";
    }
    void Person::SetName(QString pName){
        personName = pName;
        qDebug()<<personName;
    }
    QString Person::GetName(){
        return personName;
    }

    更为高级的接口类,后续

    2017-06-13 10:16:58

    如果多个类同事继承基类,成为子类后,在声明接口类类对象调用虚函数时,怎么判断调用的是哪个子类的虚函数呢?这里要注意以下几点:

    1. 接口类生命的对象只能是指针类型。
    2. 具体调用哪个子类里面父类纯虚函数的实现要取决于接口类中调用纯虚函数的对象指向哪个子类。
    3. 可以动态的指定子类
    #include "dog.h"
    #include <QDebug>
    Dog::Dog()
    {
        DogName = "";
    }
    
    void Dog::Eat(){
        qDebug()<<"eat bread";
    }
    void Dog::Sleep(){
        qDebug()<<"Sleep 1 hour";
    }
    void Dog::Hobby(){
        qDebug()<<"run 35 mins";
    }
    void Dog::Speak(){
        qDebug()<<"Dog speak a lot of language";
    }
    void Dog::SetName(QString pName){
        DogName = pName;
        qDebug()<<DogName;
    }
    QString Dog::GetName(){
        return DogName;
    }
    

    上面又写了一个Dog类。

    int main(){
        BaseInterface *pBaseInterface = new Person();
        pBaseInterface->sleep();
        BaseInterface *pBaseInterface1 = new Dog();    
        pBaseInterface1->Sleep();
        return 0;
    }

    动态指定子类可以使用类模板,请关注后续

    作者:first_semon
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题,欢迎交流
  • 相关阅读:
    EBGAN
    Inception Score
    对称加密系统,攻击方式
    tensorboard的使用
    pip更新后,下载慢,国内更新源
    VSCODE快捷键
    Ajax JS
    ORM操作之Django后台管理、外键、QuerySet、查询sql语句、用户管理
    ORM操作之分类、创建数据库表结构流程、基本操作、操作表结构、字段类型、字段参数
    路由系统 视图 默认数据交互规则 获取用户提交信息
  • 原文地址:https://www.cnblogs.com/first-semon/p/6957475.html
Copyright © 2020-2023  润新知