您的位置:首页 > 编程语言 > C语言/C++

C++中实现类似java中接口的功能

2014-08-17 16:17 567 查看
用过Java的人对Java中的接口(interface)一定不陌生,就算没有自己写过接口,也多多少少用过,最近我突然想C++中如何实现与Java中的接口一样的功能?刚开始以为用虚函数就能简单搞定,后来发现,还是有点不太一样,下面我们来看个究竟~

先上一段Java中的interface的例子,比如说有一个interface叫MyInterface,其中有一个叫show的方法:

public interface MyInterface {
void show();
}


然后有两个类MyClass1,MyClass2实现了这个interface:

class MyClass1 implements MyInterface{
@Override
public void show() {
System.out.println("There is MyClass1");
}
}
class MyClass2 implements MyInterface{
@Override
public void show() {
System.out.println("There is MyClass2");
}
}


可以统一用MyInterface变量统一调用show方法,如调用MyClass1中的show:

<pre name="code" class="java">MyInterface mi=new MyClass1();
mi.show();




调用MyClass2中的show:

MyInterface mi=new MyClass2();
mi.show();
也就是说,不必用每个类的实例去调用类中的show,就是说,不用写成这样:

MyClass1 mc1=new MyClass1();
mc1.show();
MyClass2 mc2=new MyClass2();
mc2.show();
可以用一个MyInterface变量统一调用show,不管将来还有哪着个class实现了MyInterface,都可以用一个MyInterface变量来调用show,这个show就是对应的class中实现的。而且Java中要求,如果一个class implements了一个接口,必须实现接口里的方法,也就是说,像下列这样写是不行的:

class MyClass1 implements MyInterface{

}
编译会报错,因为没实现接口中的show方法。

好了,要在C++中实现类似Java interface的功能,就要实现两点:【1】接口变量会根据不同的class调用对应class中的函数。【2】如果一个class要实现一个接口,必须实现接口中的函数。

下面先看看【1】如何实现?用虚函数就可以实现,代码如下:

#include <iostream>
using namespace std;
class MyInterface{
public:
    virtual void show(){
        cout<<"There is MyInterface"<<endl;
    }
};
class MyClass1:public MyInterface{
public:
    void show(){
        cout<<"There is MyClass1"<<endl;
    }
};
class MyClass2:public MyInterface{
public:
    void show(){
        cout<<"There is MyClass2"<<endl;
    }
};
int main(){
    MyInterface *mi=new MyClass1();
    mi->show();//输出"There is MyClass1"
    //MyInterface *mi=new MyClass2();
    //mi->show();//输出"There is MyClass2"
    return 0;
}
将show声明为虚函数,就可以用“接口”的变量直接调用对应class所实现的show,不过这里的接口其实还是class,因为C++中没有interface这种关键字嘛~

那么这样一来完事了吗?还没呢,看下面:

#include <iostream>
using namespace std;
class MyInterface{
public:
virtual void show(){
cout<<"There is MyInterface"<<endl;
}
};
class MyClass1:public MyInterface{

};
class MyClass2:public MyInterface{

};
int main(){
MyInterface *mi=new MyClass1();
mi->show();//输出""There is MyInterface""
//MyInterface *mi=new MyClass2();
//mi->show();//输出""There is MyInterface""
return 0;
}
上面的代码中,MyClass1和MyClass2没有实现show也完全OK,那么如何像Java那样强制MyClass1和MyClass2实现show呢?

解决方法就是把MyInterface中的show声明为纯虚函数,这样一样,要想使用MyClass1和MyClass2创建对象,就必须在里面实现show,否则MyClass1和MyClass2就是虚基类,因为包含了纯虚函数show。以下是最终代码:

#include <iostream>
using namespace std;
class MyInterface{
public:
virtual void show()=0;
};
class MyClass1:public MyInterface{
public:
void show(){
cout<<"There is MyClass1"<<endl;
}
};
class MyClass2:public MyInterface{
public:
void show(){
cout<<"There is MyClass2"<<endl;
}
};
int main(){
MyInterface *mi=new MyClass1();
mi->show();//输出"There is MyClass1"
//MyInterface *mi=new MyClass2();
//mi->show();//输出"There is MyClass2"
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: