我在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(){
/......../
}
上述两者有何不同,是否都是“接口”?
因为我们需要一个接口来实现我们的类,并且看起来上述两种方法都可以为我们做到这一点。
答案 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
}