我是C++新手,我用Java编码了一年。接口和抽象类的C++中的等价物只是抽象类。这是否应该是工厂设计时的一个障碍?有很多时候我想省略继承类的定义方法,我想强制执行它。C++抽象类
C++抽象类
回答
Java接口最好翻译成C++抽象类。在Java中(据我所知),接口只是抽象类的一个子集,只是它允许C++在所有情况下都具有“多重继承”。
class thing_interface {
public:
virtual ~thing_interface() {}
virtual void foo() =0; //pure virtual function
};
class other_interface {
public:
virtual ~other_interface() {}
virtual void bar() =0; //pure virtual function
};
class thing_impl : public thing_interface, public other_interface {
protected:
int member;
public:
thing_impl() : member(0) {}
virtual ~thing_impl() {};
virtual void foo() { std::cout << "FOO!\n";}
virtual void bar() { std::cout << "BAR!\n";}
};
的=0
语法意味着它未在接口中定义的,但必须在于满足接口类来定义。还要注意,如果你有任何虚拟函数,你几乎总是也想要一个虚拟析构函数。由于没有实现函数,因此如果您尝试单独制作thing_interface
,C++会告诉您一个错误。
这不是一个障碍,因为我不能想到Java在这里可以做的任何C++所不能做到的事情。
我是一个完整的C++ noob。所以也许我不明白一切正确。对我来说,这个“接口”看起来更像是一个抽象类,Java中的抽象类也可以有字段。 (比如'int member;')这一切看起来像Java中的抽象类中的抽象方法。但抽象类与接口不同。 –
这只是确切的:我不认为你可以像继承类构造函数那样初始化public(!)'member',因为它是'thing_interface'classe的成员。或者我错了? – azf
@Fatal:是的,C++中的抽象类与Java中的抽象类非常相似。但是,C++没有“接口”的单独概念,因此您也可以使用抽象类来在Java中使用接口。如果你希望它成为一个接口,你就不会放入任何数据成员或非纯虚函数。 –
如果这样定义,你可以有你想要的东西:
class A {
public:
virtual void pure_virtual(int param1) = 0;
virtual ~A() { };
};
编辑:感谢尼古拉和Mike!
一个重要的省略 - 你*需要*添加一个虚拟析构函数。 –
你通常不希望析构函数是* pure * virtual(只是虚拟的)。它需要一个实现,不管它是否纯粹,并且在类定义'virtual〜A(){}'中定义它最简单。 –
就界面/抽象类而言,你不会觉得障碍。您应该阅读关于C++纯虚函数和抽象类。
要在C++接口,这里是须藤代码:
class MyInterface {
virtual void func1() = 0;
virtual int func2(int x, int y) = 0;
}
class MyAnotherInterface {
virtual void func3() = 0;
virtual int func4(int x, int y) = 0;
}
要具有抽象类在C++中,这里是须藤代码。你可以看到它只从上面的接口实现一个功能。所以你不能创建它的实例。
class MyAbstract : public MyIterface {
void func1() {
printf("in func1");
}
}
现在实际的具体类:
class MyConcreteClass : public MyAbstract, public MyAnotherIterface {
int func2(int x, int y) {
printf("func2 x=%x,y=%y",x,y);
}
void func3() {
printf("in func3");
}
int func4(int x, int y) {
printf("func4 x=%x,y=%y",x,y);
}
}
有当您使用多重继承,因为我使用MyConcreteClass一些问题。但是如果你只有一个带有成员变量的基类,而其他基类只包含纯虚函数,那么这个模式的行为与Java完全相同,其中包含一些方法和成员变量的类映射到extends
以及其他只包含纯虚函数映射的类'工具。
在我们的例子中,相当于Java代码
class MyConcreteClass extends MyAbstract implements MyAnotherInterface {
public int func2(int x, int y) {
System.out.print(String.format("func2 x=%x,y=%y",x,y));
}
public void func3() {
System.out.print("in func3");
}
public int func4(int x, int y) {
System.out.print(String.format("func4 x=%x,y=%y",x,y));
}
}
当你喂差点
唯一的其他地方,我从Java到来时感觉障碍为仿制药。 C++为此提供了模板,但它们有一些严重的限制。
最好解释,至少对于像我这样的Java背景的人来说。 –
- 1. c#抽象类
- 2. C++抽象类
- 3. 使用抽象类中抽象类的引用抽象类c
- 4. C#:抽象类中的抽象和非抽象方法?
- 5. c#接口,抽象类,强制继承类不抽象类
- 6. C#抽象类构造器
- 7. C#抽象类错误
- 8. C++中的抽象类
- 9. 抽象多个C#类
- 10. C++抽象类模板
- 11. 抽象类 - 在C++实践
- 12. VTABLE为抽象类C++
- 13. C#抽象类和协
- 14. C++使用抽象基类
- 15. 从抽象类继承C#
- 16. C++抽象类型声明
- 17. C#中的抽象类#
- 18. C++抽象类的问题
- 19. C++抽象类的继承
- 20. C#接口和抽象类
- 21. C#抽象类实现
- 22. 通用抽象类型C++
- 23. c#委托和抽象类
- 24. 抽象类的C++继承
- 25. C++抽象模板类
- 26. 抽象类声明在C++
- 27. 抽象与抽象类
- 28. 抽象类中的动态抽象类
- 29. 抽象基类的抽象子类
- 30. 从非抽象类派生抽象类
C++中的任何内容都不成为障碍。 –