如何在c++中定义接口

How to define an interface in C++?

本文关键字:定义 接口 c++      更新时间:2023-10-16

我正在开发一个c++类,它为网络提供了BSD套接字的抽象。我想定义一个由CSocketMockSocket(后者用于单元测试)实现的接口ISocket。我知道我需要将我想实现类提供的方法定义为纯虚拟的,即

class ISocket {
public:
  virtual int Socket(int domain, int type, int protocol) = 0;
};

我担心的是ISocket类型的类是否可以实例化。我的直觉告诉我,任何至少有一个纯虚方法的类都是一个抽象类(即接口),不能被实例化,但我心里有点担心,我需要对c++编译器将提供的自动生成的构造函数和析构函数做些什么(有效的c++既是礼物——当你记得在其中读到的所有内容时——当你不记得时——是诅咒)。

我这样做是正确的吗,或者在c++中定义接口的最佳实践是我没有在这里遵循的吗?

一般来说,你应该声明一个virtual析构函数;否则,如果您尝试在指针到接口上调用delete,您将进入未定义的行为。对于构造函数就没有这样的问题。

哦,你是正确的,不能用纯虚类实例化类的对象

我的直觉告诉我,任何至少有一个纯虚方法的类都是抽象类(即接口),不能被实例化

在这件事上你的直觉是正确的。具有至少一个纯虚函数的类型不能被实例化,并且会生成编译器错误。

您做的是正确的:抽象类是专门设计用作基类的类。抽象类至少包含一个纯虚函数。不能实例化虚拟类

你认为任何具有纯虚方法的类都是抽象的,不能被实例化,这是正确的。

就我个人而言,我倾向于为我的大多数接口添加一个受保护的析构函数,因为在许多/大多数情况下,我不希望使用接口的代码能够销毁它。或者,你应该添加一个公共虚析构函数(不是纯的,有一个空的体!),这样就可以通过接口指针删除对象,并调用正确的析构函数。