C++中的接口和抽象类常常令人困惑。与Java或C#等其他编程语言不一样,C++中没有定义接口和抽象类的关键字。但是,也可以像其他语言一样,在C++中使用接口和抽象类。
首先,我们来比较接口和抽象类的概念。
- 接口没有实现任何的方法,只是进行方法的声明,继承接口的类来实现这些方法。
- 接口没有定义任何变量,尽管Java的接口中可以有变量的定义,但是变量也是会被
final
和static
修饰。 - 实现接口的类必须实现接口的所有方法。
- 抽象类可以有变量声明和方法实现/声明。此外,可以继承抽象类而不实现抽象方法。
- 抽象类不能实例化,而是由另一个类继承。实例化和抽象类将导致编译错误。
在了解如何定义抽象类和接口之前,让我们先了解在C++中什么是虚方法和纯虚方法。
虚方法:需要在派生类中进行重新定义,使用virtual
关键字告诉编译器对该方法执行动态链接或后期绑定。
纯虚方法:是一种不需要定义而只需要声明的虚方法,它是通过在方法最后添加=0
进行声明。
C++中的抽象类:
- 最少具有一个纯虚函数。
- 可以有实现的方法。
- 可以进行变量定义。
#include <string>
#include <iostream>
/*Declaring an abstract class*/
class AbstractClass{
public:
AbstractClass(std::string msg): message(msg){}
virtual void method_first() = 0; // a pure virtual method
virtual void method_second(){ // implemented virtual method
std::cout << message << std::endl;
}
private:
std::string message;
};
C++中的接口:
- 所有的函数必须被声明为纯虚函数。
- 没有变量的声明。
/*an interface declaration*/
class InterfaceClass{
public:
// declaring a pure virtual method by assigning 0
virtual void method_first() = 0 ;
virtual void method_second() = 0;
};
什么时候使用接口:
当实现的功能彼此不相关时,创建的每个对象都是独立的,我们使用接口。
什么时候使用抽象类:
当试图创建一个功能的多个版本时,当创建的对象之间存在某种关系时,我们使用抽象类。
参考
Abstract class vs Interface in C++ | by Manish Sonal | Medium