Equivalent of Java interfaces in C++?
Possible Duplicate:
How do you declare an interface in C++?
Interface as in java in c++?
我是一个学习C++的Java程序员,我想知道C++中是否有类似Java接口的东西,即另一个类可以实现/扩展不止一个的类。谢谢。这里是新来的,所以告诉我是否做错了什么。
- C++支持完全多重继承,所以类和接口之间没有区别,如Java。如果用纯纯方法制作一个类,那么它就相当于一个Java接口。
- 只包含纯虚拟成员函数的抽象类。
- 还要考虑vc++'s'uu interface'关键字。检查MSDN。
- 这个问题StAppExoal.COM/提问/ 6831161 /接口,如Java中的-‌和8203;C甚至更确切地说是一个副本(但是它本身已经被关闭了,就像我上面链接的一个副本一样)。
- "DaoWen"如果你用纯纯的方法制作一个类,那么它就相当于一个Java接口。看看我的答案。
- @亲密选民:你已经阻止了对这个问题的任何真正的回答,把这个问题作为一个已经被关闭的复制品关闭,后者被称为一个模糊相关问题的复制品。当你觉得有必要把一个问题当作一个已结束问题的复制品来结束时,请尽量不要按这个冲动行事。谢谢。
在C++中,只包含纯虚方法的类表示接口。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| // Define the Serializable interface.
class Serializable {
// virtual destructor is required if the object may
// be deleted through a pointer to Serializable
virtual ~ Serializable() {}
virtual std ::string serialize () const = 0;
};
// Implements the Serializable interface
class MyClass : public MyBaseClass, public virtual Serializable {
virtual std ::string serialize () const {
// Implementation goes here.
}
}; |
- 您需要虚拟继承来模仿Java接口实现。FTFY。
- @干杯,谢谢。-好的。谢谢你的帮助。
- -1,它是抽象类,不是接口。您不能通过它的接口拥有对象,即接口不能有公共析构函数。(除非是IDestructible接口)。
- Abyx是Java特有的吗?在C++中,可以通过指向一个接口的指针删除一个对象(如果它是析构函数被声明为虚拟的)。这是否合适取决于应用程序。如果不合适,那么使析构函数受保护将强制执行该规则。
- @abyx"接口不能有公共析构函数"源?C++的官方定义是什么?
若要模仿Java EDCOX1(0),可以使用只具有纯虚函数的普通基。
您需要使用虚拟继承,否则可以获得重复继承:在C++中,同一类可以是一次以上的基类。这意味着在这种情况下,对这个基类的访问是不明确的。
C++没有提供与Java EDCOX1(0)完全等价的内容:在C++中,重写虚拟函数只能在具有虚拟函数声明的类的派生类中完成,而在Java中,EDCOX1×0的方法中的重写器可以在基类中声明。
例:
1 2 3 4 5 6 7 8 9 10 11
| struct B1 {
void foo ();
};
struct B2 {
virtual void foo () = 0;
};
struct D : B1, B2 {
// no declaration of foo() here
}; |
D继承了too函数声明:B1::foo()和B2::foo()。
B2::foo()是纯虚拟的,所以D::B2::foo()也是纯虚拟的;B1::foo()不重写B2::foo(),因为B2不是B1的派生类。
因此,D是一个抽象类。
最后的例子
不管怎么说,你为什么要在C++中模拟Java的任意限制?
编辑:添加了澄清示例。
- 我通常试图避免C++中的多重继承,所以我以前从未遇到过虚拟继承。感谢您的澄清!
- @道文:请注意,这个答案在技术上是错误的,而且海报拒绝修改。
- @干杯。-阿尔夫:你能详细解释一下为什么它是不正确的吗?
- @道文:第三段至少有两种解释,但都是错误的。在C++中,可以继承接口的实现,即Java风格。这就是虚拟继承在这个上下文中的作用。在第二个PARA中提到的"好奇家伙"部分只是间接相关的:它是允许Java类实现继承的基础部分,但它不能启用它。
- Java中"接口"的概念不是"限制"。这是一种很好的方法,可以确保在不能提供通用X函数的情况下类可以执行X,因为实现太依赖于类的工作方式。
- @ thojHman JavaEDCX1〔1〕任意阉割。不允许方法提供实现没有合理的动机。C++中的基类不具有此限制。
- @拉拉森德-阿尔夫回到主题:如果我的答案模糊不清或不清楚,我可以试着澄清它。请解释第2段是如何间接相关的。你如何解释第三段?
- 这么多的仇恨…
- @干杯,谢谢。-阿尔夫,你能用事实来支持你的批评吗?
- @ CuulouGuy:"在C++中,重写虚函数的语句只能在具有虚函数声明的类的派生类中完成,而在Java中,接口中的方法的重写器可以在基类中声明"对于C++是不正确的。示例:(ideone.com/9t0vzo)。
- @主持人:你刚刚删除了解释答案错误的陈述,只留下了后遗症的讨论。
- @好奇心:为了帮助谷歌搜索这项技术,它被称为"统治继承"(在虚拟继承层次中)。本标准未使用该术语。但例如在Visual C++警告中。
- @干杯,谢谢。-我已经编辑了我的答案。