如何在C++中实现接口?

114

可能是重复问题:
C++中模拟接口的首选方法

我很好奇C++是否有接口,因为在Java中,实现设计模式通常是通过使用接口将类解耦。那么在C++中是否有一种类似的创建接口的方式呢?


同样的问题也可以在 https://dev59.com/vnRC5IYBdhLWcg3wXP0C 找到。 - StayOnTarget
1
你真的需要接口吗?C ++对模板有广泛的支持。只需编写接受模板的函数,并确保传递的类型具有所需的方法以避免编译错误,这样您就不必让用户继承任何东西来使用您的方法。 - ABu
3个回答

165

C++没有内置接口的概念。您可以使用仅包含纯虚拟函数抽象类来实现它。由于它允许多重继承,因此您可以继承此类以创建另一个类,该类将包含此接口(我是说,对象接口 :))。

例如:

class Interface
{
public:
    Interface(){}
    virtual ~Interface(){}
    virtual void method1() = 0;    // "= 0" part makes this method pure virtual, and
                                   // also makes this class abstract.
    virtual void method2() = 0;
};

class Concrete : public Interface
{
private:
    int myMember;

public:
    Concrete(){}
    ~Concrete(){}
    void method1();
    void method2();
};

// Provide implementation for the first method
void Concrete::method1()
{
    // Your implementation
}

// Provide implementation for the second method
void Concrete::method2()
{
    // Your implementation
}

int main(void)
{
    Interface *f = new Concrete();

    f->method1();
    f->method2();

    delete f;

    return 0;
}

@CharlesBailey:抱歉,忘记提到了。感谢你发现了这个问题!现在可以了吗? - MD Sayem Ahmed
8
@CharlesBailey:嗯,我没有使用编译器,是根据我的记忆写下来的... 可能这就是我错过那么多东西的原因... - MD Sayem Ahmed
2
2018年了,C++还是没有基本接口系统,真是该死,我讨厌除了C++以外别无选择。 - Phil
1
使用 override 关键字而不是 =0 会更加清晰吧? - Lars Nielsen
10
C++有接口,但C++并没有 关键字 interface - Caleth
显示剩余2条评论

23

"接口" 相当于 C++ 中的 "纯虚类"。理想情况下,这个 "接口" 类应该只包含纯虚的 public 方法和 static const 数据成员。例如:

struct MyInterface
{
  static const int X = 10;

  virtual void Foo() = 0;
  virtual int Get() const = 0;
  virtual inline ~MyInterface() = 0;
};
MyInterface::~MyInterface () {}

3
虚析构函数怎么样? - CB Bailey
2
我会添加一个虚拟析构函数以避免未来可能出现的内存泄漏。 - barankin
@CharlesBailey,没注意到。已编辑帖子。添加了纯virtual以保持类的纯abstract性,并添加了inline以便它可以在头文件中驻留而不会出现链接器错误。 - iammilind
2
在类定义中定义析构函数会更简单。您可以这样做:virtual ~interfaceA() {}。由于您的类已经是抽象的,因此将析构函数定义为纯虚函数并没有任何好处。 - CB Bailey
5
内存泄漏与虚拟析构函数无关,它只与编写正确的 C++ 代码有关。 - Kerrek SB

17

C++ 中没有接口(Interface)的概念,但可以使用抽象类来模拟。

抽象类是至少有一个纯虚函数的类,不能创建抽象类的任何实例,但可以创建指向抽象类的指针和引用。继承自抽象类的每个类都必须实现纯虚函数,以便可以创建它的实例。


这不就是接口的概念吗?因为抽象基类在理论上甚至允许更多?还是因为关键字不是“接口”? - IceFire
@IceFire:因为C++没有关键字interface - Alok Save
啊,所以如果一种语言有类似于接口的东西,但是有一个像“ifc”这样的简短形式,那么它也没有接口的概念?而且在EC6之前,JS没有类,因为你需要编写“function”?Java是否也没有泛型,因为它没有“generic”关键字? - IceFire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接