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

时间:2014-11-25 07:39:56

标签: c++ interface

我在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(){
  /......../
}

上述两者有何不同,是否都是“接口”?

因为我们需要一个接口来实现我们的类,并且看起来上述两种方法都可以为我们做到这一点。

3 个答案:

答案 0 :(得分:2)

这里A_interface是抽象类(接口),因为它具有纯虚函数

的函数成员
 virtual void Show() = 0;

现在考虑MyClass;所有声明都在MyClass.h中,实现在MyClass.cpp中(这是优先的方法)。

两者有何不同? 一个是抽象类(不能具有类型为A_interface的对象,而是必须从中删除一个类并覆盖其纯虚函数。) 其他很简单。

答案 1 :(得分:1)

当您将其中一个类方法定义为等于零时,您将使该类成为抽象基类,因此无法实例化(接口)。可以定义抽象基类中的一些方法。虽然您无法为抽象基类实例化对象,但您可以声明指向它的指针。

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!

答案 2 :(得分:1)

您可能需要编写头文件,定义接口类

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