C++中实现类似java中接⼝的功能
⽤过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");
}
java接口可以创建对象吗}
可以统⼀⽤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;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论