C++里的接口(Interface)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++里的接口(Interface)相关的知识,希望对你有一定的参考价值。
C++是允许多重继承的,而这个设计既会引起问题又不是很常用,于是java和C#都采用了另一种方式:接口(Interface)。类继承(实现)接口并不表明 is-a关系,而是“有某种功能”、“符合某种性质”的关系。C++虽然语法上不支持接口,但是这个思路还是可以拿来用的嘛。比如设计这样一个接口:
struct hashable { virtual size_t hash_code() = 0; };
然后让一个类继承它,并实现函数,就代表了该类是可哈希的。
事情没这么简单,在C++里,接口还可以有很多魔性的用法,尤其是遇上泛型的时候。有时候,当你继承接口并实现一个函数的时候,它会自动帮你实现其它功能;有时候,当你继承的时候,一切都完成了。看一下下面这个例子(出自boost::operators):
template<class T> struct less_than_comparable { friend bool operator> (const &T x, const &T y) {return !(x<y || x==y);} friend bool operator<= (const &T x, const &T y) {return x<y || x==y;} friend bool operator>= (const &T x, const &T y) {return !(x<y);} };
它用起来稍微有些奇怪,继承的时候需要用子类作父类的模板参数,比如:
class my_class : public less_than_comparable<my_class> { //实现friend operator< 与operator== };
与java或C#里的情况不同,接口里定义的函数与在子类里实现的函数并不相同,接口里的函数是扩展实现函数的功能。这样,程序员只要实现<与==,就自动获得了>、<=与>=的实现。
如果像这样的泛型接口里的函数既与类型无关,又不依赖别的函数,就可以达到“继承即实现”的效果了,一个例子是boost::serialization::singleton,这个在网上有关单件模式的实现的文章里可以看到。
以上是关于C++里的接口(Interface)的主要内容,如果未能解决你的问题,请参考以下文章