如何在C++中实现接口或类似接口的关系?与 .h 文件混淆,void () = 0

How to implement interface or interface-like relation in C++? Confused with .h file and void () = 0

本文关键字:接口 文件 void 关系 C++ 实现      更新时间:2023-10-16

我在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!