类似于Java的类"interface"类的C ++?

c++ "interface"-like classes similar to Java?

本文关键字:类的 interface Java 的类 类似于      更新时间:2023-10-16

在Java中,您可以将接口定义为没有实际代码实现的类,而只能定义类必须实现的方法。这些类型可以作为参数传递给方法并从方法返回。在c++中,纯虚类不能用作参数或返回类型,据我所知。有没有办法模仿Java的接口类?

我在c++中有一个字符串类,以及从基字符串类派生的不同编码(如UTFxxx, ISOxxx等)的几个子类。然而,由于有这么多不同的编码,基类没有有意义的实现。但是,如果我能把它作为自己的对象来处理,并且对该对象的调用将调用它继承的正确的子类,那么它将很好地充当接口。

如果只使用引用或指针,则纯虚类可以用作返回类型。

实际上,在Java中,Interface foo = Implementer();等于Interface* foo = Implementer();, implements Foo等于public virtual Foo

下面是一个Java示例:

interface Foo {
    public void doFoo();
}
class Bar implements Foo {
    public void doFoo() { }
}

与c++对应:

struct Foo {
    virtual void doFoo() = 0;
    virtual ~Foo() { }
};
class Bar : public virtual Foo {
public:
    virtual void doFoo() { }
    virtual ~Bar() { }    
};

当然,如果你使用Foo foo;, c++会抱怨类型不完整。必须使用Foo& fooFoo* foosmart_pointer<Foo> foo

在本例中,smart_pointer可以是scoped_ptrunique_ptrshared_ptr,这取决于您是否想要

  • 只是一个智能指针,delete()s在销毁
  • 带有移动语义的智能指针
  • 一个做引用计数的智能指针

注意boost智能指针,如果你使用它们,使用get()/reset()语义来获取和设置指针的值

不能按值使用纯虚类,但可以通过指针或引用传递它。这包括将其封装在智能指针类型(如unique_ptrshared_ptr)中传递的能力。

您还应该确保使用virtual关键字在接口上标记析构函数,以防止潜在的内存泄漏。

当然可以像使用接口一样使用类,但它不是语言的构造,它只是一个只有纯虚方法的类。请记住,接口正是Java实现多重继承的方式,没有所有棘手的问题(父类的两个副本,具有相同名称的多个变量,等等)

下面是Google c++风格中接口的定义:

满足以下要求的类是纯接口:

  • 它只有公共纯虚("= 0")方法和静态方法(但参见下面的析构函数)。
  • 不能有非静态数据成员
  • 不需要定义任何构造函数。如果提供了构造函数,它必须不接受参数,并且必须受到保护。
  • 如果它是一个子类,它只能从满足这些条件的类派生出来,并且用Interface后缀标记。

接口类永远不能被直接实例化,因为它声明了纯虚方法。为了确保接口的所有实现都可以正确地销毁,接口还必须声明一个虚析构函数(在第一条规则的异常中,它不应该是纯的)。参见Stroustrup, c++编程语言,第3版,第12.4节。

看一下Google c++风格指南,"多重继承"answers"接口"部分。http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml