【问题标题】:how to implement Interfaces in C++? [duplicate]如何在 C++ 中实现接口? [复制]
【发布时间】:2012-04-03 03:42:42
【问题描述】:

可能重复:
Preferred way to simulate interfaces in C++

我很想知道 C++ 中是否有接口,因为在 Java 中,设计模式的实现主要是通过接口解耦类。那么有没有类似的方法在 C++ 中创建接口?

【问题讨论】:

  • 你真的需要接口吗? C++ 对模板有广泛的支持。只需编写接收模板的函数,并确保传递的类型具有不会导致编译错误的 require 方法,因此您不会强迫用户从任何东西继承来使用您的方法。

标签: c++ interface concept


【解决方案1】:

C++ 没有内置的接口概念。您可以使用仅包含pure virtual functionsabstract classes 来实现它。由于它允许多重继承,你可以继承这个类来创建另一个类,然后在其中包含这个接口(我的意思是对象接口:))。

一个例子是这样的 -

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;
}

【讨论】:

  • 您的示例具有未定义的行为,因为接口没有虚拟析构函数。
  • ...虽然您的示例也不应该编译,因为您定义了 Concrete::method1 和 Concrete::method2 但它们不是 Concrete 和 you.instantiate Concrete 的有效成员,尽管它仍然是抽象的。
  • @CharlesBailey:嗯,我没有使用任何编译器,是凭记忆写下来的……可能这就是为什么我错过了很多东西……
  • 来吧 2018 仍然没有 C++ 中的基本接口系统,f@# 看在上,我讨厌除了 C++ 没有其他选择
  • @fdsfdsfdsfds C++ 有接口。 C++ 没有关键字 interface.
【解决方案2】:

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

struct MyInterface
{
  static const int X = 10;

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

【讨论】:

  • 虚拟析构函数怎么样?
  • 我会添加一个虚拟 dtor 以避免将来可能的内存泄漏。
  • @CharlesBailey,错过了。编辑了帖子。添加为纯virtual 只是为了维护类的纯abstractness 和inline,以便它可以驻留在头文件中而不会出现链接器错误。
  • 在类定义中定义析构函数会更简单。你可以做virtual ~interfaceA() {}。您的类已经是抽象的,因此您不会通过将析构函数设为纯虚函数来获得任何收益。
  • @barankin:内存泄漏与虚拟析构函数无关。这只是关于编写正确的 C++。
【解决方案3】:

C++中没有接口的概念,
您可以使用 Abstract class 模拟该行为。
抽象类是具有至少一个纯虚函数的类,一个不能创建抽象类的任何实例,但您可以创建指向它的指针和引用。此外,从抽象类继承的每个类都必须实现纯虚函数才能创建它的实例。

【讨论】:

  • 这不是接口的概念吗?因为抽象基类在理论上允许更多?还是因为关键字不是“界面”?
  • @IceFire:因为C++没有关键字interface
  • 啊。因此,如果一种语言有“类似”接口的东西,但有一个像“ifc”这样的缩写形式,它也不会有接口的概念吗?并且 JS(在 EC6 之前)没有类,因为您需要编写“函数”? Java 是否也没有泛型,因为它没有“泛型”关键字?
猜你喜欢
  • 2018-07-13
  • 2020-04-03
  • 2012-03-01
  • 2020-04-30
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多