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,这个在网上有关单件模式的实现的文章里可以看到。

时间: 2024-08-24 08:12:40

C++里的接口(Interface)的相关文章

认识接口(Interface)设计

by 高煥堂 认识接口(Interface)设计 1.两种接口:主动型与被动型  就软件主板(MB)设计(开发)者而言,反向调用的接口(如<I>)能让主板获得主控权,所以又称为主动型接口或强势型接口.而正向调用的接口(如CI接口)则让子类或Client类获得主控权,所有(从主板视角而言)又称为被动型接口. 无论是主动型或被动型接口都是主板的基类(或称为父类)所提供的,但是这两种接口对于子类(或Client类)的制约能力并不相同,主动型接口让基类具有强大的制约能力(所以称为强势接口),可以主导子

delphi 接口Interface

学习 delphi 接口 一切都是纸老虎!!! 第四章          接口 前不久,有位搞软件的朋友给我出了个谜语.谜面是“相亲”,让我猜一软件术语.我大约想了一分钟,猜 出谜底是“面向对象”.我觉得挺有趣,灵机一动想了一个谜语回敬他.谜面是“吻”,也让他猜一软件术 语.一分钟之后,他风趣地说:“你在面向你美丽的对象时,当然忍不住要和她接口!”.我们同时哈哈大 笑起来.谈笑间,似乎我们与自己的程序之间的感情又深了一层.对我们来说,软件就是生活. 第一节  接口的概念 “接口”一词的含义太广泛

C#编程利器之三:接口(Interface)【转】

C#编程利器之三:接口(Interface) C#接口是一个让很多初学者容易迷糊的东西,用起来好象很简单,定义接口,然后在里面定义方法,通过继承与他的子类来完成具体的实现.但没有真正认识接口的作用的时候就觉得用接口是多此一举,当然你这样想是绝对错误的.在软件设计中有一个非常重要的原则就是:面向接口编程,依赖与接口或抽象层.可见接口在真正的开发中是多么的重要. 在之前C#编程利器之一:类(Class)一文里介绍了类的相关知识,本文主要介绍OO编程中的另一个重要知识点--接口.在某种程度上说,接口也

接口 interface ,抽象类 abstract

接口是类的模板,类是对象的模板. 使用关键字interface 定义了一个接口Person,接口中有两个方法: 使用关键字implements实现了接口,实现类Man里需要实现接口中的所有方法,否则会报错. L类中的factory方法是调用接口的一个例子,其中传入的参数$user 使用了 Person 接口进行了类型限制,说明传入的参数必须是实现了Person接口的类(比如说Man类). 接口可以被多次实现,比如把代码中的Man类复制粘贴改成Woman类,就是另外一次实现接口了. 接口也是可以被

JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展

JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来聊聊final这个关键字 final可以修饰类,方法和变量 final修饰的类不可以被继承 final修饰的方法不可以被覆盖 final修饰的变量是一个常量,只能被赋值一次 内部类只能访问被final修饰的局部变量 final,故名思意,就是最终的意思,由以上的五种特性,不过final的出现,也是有

JavaSE入门学习21:Java面向对象之接口(interface)(二)

一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.java源文件代码: public class Test{ public static void main(String[] args){ //实现接口Singer Singer s1 = new Student("Amy"); s1.sing(); s1.sleep(); s1.study

接口 Interface

interface 关键字 声明接口 接口中的成员默认都是public 能力不一样的时候适合用接口 using System; using System.Collections; using System.Collections.Generic; namespace Dome { class dom { static void Main(string[] args) { play iplay = new student(); iplay.iplay(); Console.WriteLine();

Android中接口(Interface)的简单使用

  Android中接口(Interface)的简单使用 Java中的接口可以被看作是只包含常量和抽象方法的抽象类 . 可以使用如下方式定义一个接口: public interface InterfaceDemo { int i = 10; void method1(); int method2(); } 使用1: 解决“多重继承”的问题 Java语言本身是不支持类的多重继承(多重继承是指一个类从多个类继承而来,即一个类拥有多个超类)的,但一个类却可以实现多个接口.这样,我们可以将一些抽象方法定

C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较

由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针类型来判断的).纯虚函数是一种在父函数中只定义而不实现的一种函数,不能用来声明对象,也可以被称为抽象类.纯虚函数的实现也可以在类声明外进行定义.C++中的抽象类abstract class是指至少有一个纯虚函数的类,如果一个类全部由纯虚函数组成,不包括任何的实现,被称为纯虚类. Java中的普通函数