zoukankan      html  css  js  c++  java
  • 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
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题,欢迎交流
  • 相关阅读:
    四个好看的CSS样式表格
    POJ 2255 Tree Recovery
    黑马程序猿_2014 7月 我使用多线程体验
    Dos命令将合并两个文本文件的内容
    栈和堆之间的差(他转身无数的文章)
    【Espruino】NO.12 加速度计演示
    MySQL进口.sql文件和常用命令
    typedef和define具体的具体差异
    muduo网络图书馆评测
    Web采矿技术
  • 原文地址:https://www.cnblogs.com/first-semon/p/6957475.html
Copyright © 2011-2022 走看看