在Java中,您可以将接口定义为没有实际代码实现的类,但只定义类必须实现的方法。这些类型可以作为参数传递给方法并从方法返回。在C ++中,根据我的判断,纯虚拟类不能用作参数或返回类型。有什么方法可以模仿Java的接口类吗?
我在C ++中有一个字符串类,并且有几个子类用于从基本字符串类派生的不同编码(如UTFxxx,ISOxxx等)。但是,由于存在许多不同的编码,因此基类没有有意义的实现。但是如果我可以将它作为自己的对象处理它并且对该对象的调用将调用它继承的正确子类,它将作为一个接口。
答案 0 :(得分:3)
如果只使用引用或指针,则可以将纯虚拟类用作返回类型。
事实上,在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 ++会抱怨不完整的类型。 1}},Foo& foo
或Foo* foo
是必需的。
在此示例中,smart_pointer<Foo> foo
可以是smart_pointer
,scoped_ptr
或unique_ptr
,具体取决于您是否需要
shared_ptr
销毁请注意,如果使用boost智能指针,请使用delete()s
/ get()
语义来获取和设置指针值。
答案 1 :(得分:2)
您不能按值使用纯虚拟类,但可以通过指针或引用传递它。这包括在智能指针类型(例如unique_ptr
或shared_ptr
)内传递它的能力。
您还应该确保在接口上使用virtual
关键字标记析构函数,以防止潜在的内存泄漏。
答案 2 :(得分:1)
你当然可以使用类似接口的类,但它不是语言的构造,它只是一个只有纯虚方法的类。请记住,接口就是Java如何在没有所有棘手问题的情况下进行多重继承(祖父类的两个副本,具有相同名称的多个变量等)
答案 3 :(得分:1)
以下是Google C ++ Style中界面的定义:
如果类符合以下要求,则它是纯接口:
由于它声明的纯虚方法,接口类永远不能直接实例化。为了确保可以正确销毁接口的所有实现,接口还必须声明一个虚拟析构函数(在第一个规则的例外情况下,这不应该是纯粹的)。有关详细信息,请参阅Stroustrup,The C ++ Programming Language,第3版,第12.4节。
请参阅Google C ++样式指南,“多重继承”和“界面”部分。 http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml