Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;抽象类 我是C++新手,我用java编码了一年。在C++中,接口和抽象类的等价物只是抽象类。这应该是工厂设计的一个障碍吗?很多时候,我不想定义继承类的方法,我想强制执行这一点。_Java_C++ - Fatal编程技术网

C++;抽象类 我是C++新手,我用java编码了一年。在C++中,接口和抽象类的等价物只是抽象类。这应该是工厂设计的一个障碍吗?很多时候,我不想定义继承类的方法,我想强制执行这一点。

C++;抽象类 我是C++新手,我用java编码了一年。在C++中,接口和抽象类的等价物只是抽象类。这应该是工厂设计的一个障碍吗?很多时候,我不想定义继承类的方法,我想强制执行这一点。,java,c++,Java,C++,如果这样定义,您可以得到您想要的: class A { public: virtual void pure_virtual(int param1) = 0; virtual ~A() { }; }; 编辑:谢谢尼古拉和迈克 > java接口最好翻译为C++抽象类。在java中(我所知),接口只是抽象类的一个子集,除了它允许C++在任何情况下都具有“多重继承”。 class thing_interface { public: virtual ~thing_inter

如果这样定义,您可以得到您想要的:

class A {
  public:
    virtual void pure_virtual(int param1) = 0;
    virtual ~A() { };
}; 

编辑:谢谢尼古拉和迈克

> 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";}
};
class-thing\u接口{
公众:
虚拟~thing_接口(){}
虚拟void foo()=0;//纯虚拟函数
};
类其他接口{
公众:
虚拟~other_接口(){}
虚空条()=0;//纯虚函数
};
类thing\u impl:public thing\u接口,public other\u接口{
受保护的:
国际会员;
公众:
thing_impl():成员(0){
虚拟的~thing_impl(){};

虚空隙(){STD::CUT

接口/抽象类,你不会觉得有缺陷。你应该阅读C++纯函数和抽象类。

在C++中有接口,这里是SUDO代码:

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++中有抽象类,这里是SUDO代码。您可以看到它只从上面的接口实现一个函数。因此不能创建它的实例。

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完全一样,其中包含一些方法和成员变量的类映射到
扩展
和ot只包含纯虚函数的类映射到“implements”

在我们的示例中,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++有模板,但是它们有一些严重的限制。

一个重要的省略——你需要添加一个虚拟析构函数。你通常不希望析构函数是纯虚的(只是虚拟的)。它需要一个实现,不管它是否是纯的,在类定义中最简单的定义它,即代码>虚~(){{} /Cord>。C++中没有任何东西是一个障碍。我是一个完整的C++ NoOB。所以也许我不理解所有的东西。对于我这个“接口”。看起来更像是一个抽象类,Java中的抽象类也可以有字段。(例如
int member;
)它看起来都像Java中抽象类中的抽象方法。但是抽象类不同于接口。确切地说:我认为你不能初始化公共(!)<代码>成员<代码>继承类构造函数,因为它是代码> THIGIONGUDION/C++ > CLASE的成员。或者我错了吗?@致命:是的,C++中的抽象类与java中的抽象类非常类似。然而,C++没有单独的“接口”概念。,所以你也可以使用一个抽象类,在Java中使用接口。如果你想让它成为一个接口,你就不会加入任何数据成员或非纯虚拟函数。@Fatal:事实上,这是因为我的误解。我以为Java没有抽象类。我把它改得更正确,更像接口nks的家伙们。学到了一点。:)最好的解释,至少对像我这样有Java背景的人来说。