如何在C++中实现接口或类似接口的关系?与 .h 文件混淆,void () = 0
How to implement interface or interface-like relation in C++? Confused with .h file and void () = 0
我在C++看到了以下两个实现,关于类的定义和声明,这让我感到困惑,看看这个:
Class A_Interface
{
public :
virtual void Show() = 0;
}
Class A : A_Interface // implements class
{
// implements methods
}
但是,无论如何,我们有一个像这样的定义分离:
文件:
MyClass.h
class MyClass
{
void Show(){};
}
在MyClass中.cpp:
MyClass::show(){
/......../
}
以上两者有何不同,它们都是"接口"的吗?
因为我们需要一个接口来实现我们的类,而且似乎上述两种方法都可以为我们做到这一点。
这里A_interface是抽象类(一个接口),因为它具有纯虚拟的函数成员
virtual void Show() = 0;
现在考虑 MyClass;所有声明都在 MyClass.h 中,实现都在 MyClass 中.cpp(这是首选方法)。
两者有何不同?一个是抽象类(不能有类型A_interface的对象,而是你必须从中剥离一个类并覆盖它的纯虚函数。其他是简单的类。
您可能需要编写一个头文件,定义接口类:
// MyInterface.h -- Header file for MyInterface
#pragma once
class MyInterface
{
public:
// Empty virtual destructor: good practice for proper cleanup
virtual ~MyInterface() {}
// Interface methods are pure virtual:
virtual void Show() = 0;
// ... some other methods in the interface...
};
然后你可以有一个实现上述接口的类,代码在头文件和.cpp实现文件之间拆分:
// MyClass.h -- Header file for MyClass
#pragma once
#include "MyInterface.h" // Include interface's header file
class MyClass : public MyInterface
{
public:
// Methods implemented from MyInterface
void Show() override;
// NOTE: "override" is a new C++11 feature.
// If you are using an older C++98/03 compiler, you can't use it.
// Other class stuff...
};
你可以在一个.cpp文件中实现MyClass:
// MyClass.cpp -- Implementation of MyClass
#include "MyClass.h" // MyClass's header file
// Implementation
void MyClass::Show()
{
// ... code
}
当您将其中一个类方法定义为等于零时,您将该类设置为抽象基类,因此无法实例化(接口)。可以定义抽象基类中的某些方法。虽然不能实例化抽象基类的对象,但可以声明指向该对象的指针。
Class AbstractClass
{
public :
virtual void Show() = 0;
}
Class DerivedClass: public AbstractClass
{
public :
virtual void Show() = 0;
}
AbstractClass a = DerivedClass() # FAILS TO COMPILE
AbstractClass* a = new DerivedClass() # WORKS!
相关文章:
- 我可以在具有一个标头和一个接口的 cpp 文件中有多个嵌入吗?
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 一个C头文件可以被认为是一个接口吗
- 在多个头文件中从接口声明被覆盖的函数时,如何避免重复代码?
- 如何在SWIG接口文件中检查Lua版本
- 使用 AWS c++ 接口将文件上传到 s3 时内容类型标签不正确
- 在接口文件中使用模板时出现"not a type"错误的函数指针
- Python - 导入 c++ 模块接口 - 无法打开共享对象文件
- 为什么以及如何从接口定义语言 (IDL) 生成头文件
- 如何编写swig接口文件
- Pimpl习惯用法、单独的接口/实现文件和多个虚拟继承.如何
- 如何定义在多个 cpp 文件中使用的接口/API
- 我可以通过z3c++接口将SMT2文件读取到求解器中吗
- C++接口(标头)和实现文件不起作用
- cpp文件中的纯虚拟接口实现
- 如何为使用矢量的函数编写 SWIG 接口文件<string>?
- 编译器无法识别实现文件中的类成员函数类型,但在接口文件中已识别
- swig接口文件的正确sstream include路径是什么
- 如何将 Boost::shared_ptr 暴露到<T> Tcl + SWIG 接口文件?
- 是否可以禁止在 "truly lazy" SWIG 接口文件中包含类/函数?