C++中实现类似java中接口的功能
2014-08-17 16:17
567 查看
用过Java的人对Java中的接口(interface)一定不陌生,就算没有自己写过接口,也多多少少用过,最近我突然想C++中如何实现与Java中的接口一样的功能?刚开始以为用虚函数就能简单搞定,后来发现,还是有点不太一样,下面我们来看个究竟~
先上一段Java中的interface的例子,比如说有一个interface叫MyInterface,其中有一个叫show的方法:
然后有两个类MyClass1,MyClass2实现了这个interface:
可以统一用MyInterface变量统一调用show方法,如调用MyClass1中的show:
调用MyClass2中的show:
好了,要在C++中实现类似Java interface的功能,就要实现两点:【1】接口变量会根据不同的class调用对应class中的函数。【2】如果一个class要实现一个接口,必须实现接口中的函数。
下面先看看【1】如何实现?用虚函数就可以实现,代码如下:
那么这样一来完事了吗?还没呢,看下面:
解决方法就是把MyInterface中的show声明为纯虚函数,这样一样,要想使用MyClass1和MyClass2创建对象,就必须在里面实现show,否则MyClass1和MyClass2就是虚基类,因为包含了纯虚函数show。以下是最终代码:
先上一段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; }
相关文章推荐
- Delphi中实现C++/Java类似静态变量的功能
- Delphi中实现C++/Java类似静态变量的功能
- C++实现类似JAVA反射的基本功能
- 需求:iOS自定义protocol与delegate来实现类似java的接口回调功能
- C++中如何实现像Java中接口功能--C++抽象类(纯虚函数,虚函数)
- Java实现类似C/C++中的__FILE__、__FUNC__、__LINE__等,主要用于日志等功能中。
- Java利用接口和类来实现类似函数指针的功能
- JAVA--实现类似C#输入功能的Console类
- 用 Java 接口实现回调函数的等价功能
- 在C++中实现类似C#的字符串格式功能
- 用JAVA的接口实现callback功能
- Java实现类似C/C++中的__FILE__、__FUNC__、__
- java中实现类似函数指针的功能
- 用Java 接口实现回调函数的等价功能
- java实现类似百度文库功能
- java程序利用接口实现发短信功能
- C++中如何实现类似JAVA中的反射
- 在java中实现类似c语言中goto的功能
- java web中实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能)
- 如何用Java实现类似c/c++指针效果