要扩展bradtgmurray的答案,您可能希望通过添加虚拟析构函数对接口的纯虚方法列表进行一个例外。这允许您将指针所有权传递给另一方,而不会暴露具体的派生类。析构函数不必执行任何操作,因为接口没有任何具体成员。将函数定义为虚拟和内联可能看起来很矛盾,但请相信我 - 事实并非如此。
class IDemo
{
public:
virtual ~IDemo() {}
virtual void OverrideMe() = 0;
};
class Parent
{
public:
virtual ~Parent();
};
class Child : public Parent, public IDemo
{
public:
virtual void OverrideMe()
{
//do stuff
}
};
您不必为虚拟析构函数包含一个主体 - 事实证明,某些编译器在优化空析构函数时遇到问题,您最好使用默认析构函数。
用纯虚方法创建一个类。通过创建覆盖这些虚拟方法的另一个类来使用该接口。
纯虚方法是一种定义为虚拟并分配给 0 的类方法。
class IDemo
{
public:
virtual ~IDemo() {}
virtual void OverrideMe() = 0;
};
class Child : public IDemo
{
public:
virtual void OverrideMe()
{
//do stuff
}
};
除了 C#/ Java 中的抽象基类之外,你有一个特殊的接口类型类的全部原因是因为 C#/ Java 不支持多重继承。
C ++ 支持多重继承,因此不需要特殊类型。没有非抽象(纯虚拟)方法的抽象基类在功能上等同于 C#/ Java 接口。