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;
}

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

posted @ 2017-06-07 16:05  first_semon  阅读(14076)  评论(0编辑  收藏  举报