如何在c++中定义接口
How to define an interface in C++?
我正在开发一个c++类,它为网络提供了BSD套接字的抽象。我想定义一个由CSocket
和MockSocket
(后者用于单元测试)实现的接口ISocket
。我知道我需要将我想实现类提供的方法定义为纯虚拟的,即
class ISocket {
public:
virtual int Socket(int domain, int type, int protocol) = 0;
};
我担心的是ISocket
类型的类是否可以实例化。我的直觉告诉我,任何至少有一个纯虚方法的类都是一个抽象类(即接口),不能被实例化,但我心里有点担心,我需要对c++编译器将提供的自动生成的构造函数和析构函数做些什么(有效的c++既是礼物——当你记得在其中读到的所有内容时——当你不记得时——是诅咒)。
我这样做是正确的吗,或者在c++中定义接口的最佳实践是我没有在这里遵循的吗?
一般来说,你应该声明一个virtual
析构函数;否则,如果您尝试在指针到接口上调用delete
,您将进入未定义的行为。对于构造函数就没有这样的问题。
哦,你是正确的,不能用纯虚类实例化类的对象
在这件事上你的直觉是正确的。具有至少一个纯虚函数的类型不能被实例化,并且会生成编译器错误。我的直觉告诉我,任何至少有一个纯虚方法的类都是抽象类(即接口),不能被实例化
您做的是正确的:抽象类是专门设计用作基类的类。抽象类至少包含一个纯虚函数。不能实例化虚拟类
你认为任何具有纯虚方法的类都是抽象的,不能被实例化,这是正确的。
就我个人而言,我倾向于为我的大多数接口添加一个受保护的析构函数,因为在许多/大多数情况下,我不希望使用接口的代码能够销毁它。或者,你应该添加一个公共虚析构函数(不是纯的,有一个空的体!),这样就可以通过接口指针删除对象,并调用正确的析构函数。相关文章:
- 如何在基类中定义静态接口,并确保该接口必须在派生类中实现
- Java(或C++)如何处理接口中定义的方法的调用
- 对已定义的接口析构函数的未定义引用
- 如何使用 word 对象模型中的C++接口在 word 中添加自定义 XML 艺术
- 为什么以及如何从接口定义语言 (IDL) 生成头文件
- 模板接口的使用引起“未定义的引用”
- Pimpl with unique_ptr : 为什么我必须将接口构造函数的定义移动到".cpp"?
- 自定义和标准类型的数学函数的统一接口
- 如何定义在多个 cpp 文件中使用的接口/API
- 在自定义 C/C++ 程序中获取 PPP0 接口 Tx/Rx 字节的最简单方法是什么?
- 错误:在 C++ 中实现接口模式时未定义对 typeinfo 的引用
- 定义大量的接口实现
- 在继承的接口中调用自定义代码
- 接口定义中的方法声明
- 定义C++接口
- 为只接受函数的函数定义接口
- 使用MFC在COleControl中实现自定义接口
- 在定义自定义接口时继承库类
- 如何在c++中定义接口
- 通过COM返回自定义接口类型的SAFEARRAY到VB6