类似于Java的类"interface"类的C ++?
c++ "interface"-like classes similar to Java?
在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& foo
、Foo* foo
或smart_pointer<Foo> foo
。
在本例中,smart_pointer
可以是scoped_ptr
、unique_ptr
或shared_ptr
,这取决于您是否想要
- 只是一个智能指针,
delete()s
在销毁 - 带有移动语义的智能指针
- 一个做引用计数的智能指针
注意boost智能指针,如果你使用它们,使用get()
/reset()
语义来获取和设置指针的值
不能按值使用纯虚类,但可以通过指针或引用传递它。这包括将其封装在智能指针类型(如unique_ptr
或shared_ptr
)中传递的能力。
您还应该确保使用virtual
关键字在接口上标记析构函数,以防止潜在的内存泄漏。
当然可以像使用接口一样使用类,但它不是语言的构造,它只是一个只有纯虚方法的类。请记住,接口正是Java实现多重继承的方式,没有所有棘手的问题(父类的两个副本,具有相同名称的多个变量,等等)
下面是Google c++风格中接口的定义:
满足以下要求的类是纯接口:
- 它只有公共纯虚("= 0")方法和静态方法(但参见下面的析构函数)。
- 不能有非静态数据成员
- 不需要定义任何构造函数。如果提供了构造函数,它必须不接受参数,并且必须受到保护。
- 如果它是一个子类,它只能从满足这些条件的类派生出来,并且用Interface后缀标记。
接口类永远不能被直接实例化,因为它声明了纯虚方法。为了确保接口的所有实现都可以正确地销毁,接口还必须声明一个虚析构函数(在第一条规则的异常中,它不应该是纯的)。参见Stroustrup, c++编程语言,第3版,第12.4节。
看一下Google c++风格指南,"多重继承"answers"接口"部分。http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
- 具有默认模板参数的多态类的模板推导失败
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- std::具有相同基类的类的变体
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 无法访问嵌套类.类的使用无效
- 如何返回一个类的两个对象相加的结果
- C++中带有List类的迭代器Segfault
- 无法创建抽象类的实例
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 通过指向指针数组的指针访问子类的属性
- 如何比较自定义类的std::变体
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何引用基类的派生类?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 复制<Interface>作用类似于值的类的shared_ptr
- 从C++中的"interface"访问派生类成员?
- 在c++中实现Interface类的create函数
- 类似于Java的类"interface"类的C ++?